diff --git a/__tests__/integration/core-blockchain/blockchain.test.ts b/__tests__/integration/core-blockchain/blockchain.test.ts index c4494995d9..5659c655ce 100644 --- a/__tests__/integration/core-blockchain/blockchain.test.ts +++ b/__tests__/integration/core-blockchain/blockchain.test.ts @@ -136,7 +136,7 @@ describe("Blockchain", () => { const lastBlock = blockchain.state.getLastBlock(); const roundInfo = roundCalculator.calculateRound(lastBlock.data.height); const activeDelegates = await blockchain.database.getActiveDelegates(roundInfo); - const nextSlot = Crypto.slots.getSlotNumber(lastBlock.data.timestamp) + 1; + const nextSlot = Crypto.Slots.getSlotNumber(lastBlock.data.timestamp) + 1; return activeDelegates[nextSlot % activeDelegates.length]; }; @@ -156,7 +156,7 @@ describe("Blockchain", () => { const lastBlock = blockchain.state.getLastBlock(); const data = { - timestamp: Crypto.slots.getSlotTime(Crypto.slots.getSlotNumber(lastBlock.data.timestamp) + 1), + timestamp: Crypto.Slots.getSlotTime(Crypto.Slots.getSlotNumber(lastBlock.data.timestamp) + 1), version: 0, previousBlock: lastBlock.data.id, previousBlockHex: lastBlock.data.idHex, diff --git a/__tests__/integration/core-transaction-pool/processor.test.ts b/__tests__/integration/core-transaction-pool/processor.test.ts index 4523e0eb26..08a499ce07 100644 --- a/__tests__/integration/core-transaction-pool/processor.test.ts +++ b/__tests__/integration/core-transaction-pool/processor.test.ts @@ -870,14 +870,14 @@ describe("Transaction Guard", () => { // const now = 47157042; // seconds since genesis block // const transactionExists = processor.pool.transactionExists; // processor.pool.transactionExists = jest.fn(() => false); - // const getTime = Crypto.slots.getTime; - // Crypto.slots.getTime = jest.fn(() => now); + // const getTime = Crypto.Slots.getTime; + // Crypto.Slots.getTime = jest.fn(() => now); // const secondsInFuture = 3601; // const tx = { // id: "1", // senderPublicKey: "affe", - // timestamp: Crypto.slots.getTime() + secondsInFuture, + // timestamp: Crypto.Slots.getTime() + secondsInFuture, // }; // processor.__filterAndTransformTransactions([tx]); @@ -888,7 +888,7 @@ describe("Transaction Guard", () => { // }, // ]); - // Crypto.slots.getTime = getTime; + // Crypto.Slots.getTime = getTime; // processor.pool.transactionExists = transactionExists; // }); diff --git a/__tests__/unit/core-blockchain/blockchain.test.ts b/__tests__/unit/core-blockchain/blockchain.test.ts index 6b3cc6054c..65194144b8 100644 --- a/__tests__/unit/core-blockchain/blockchain.test.ts +++ b/__tests__/unit/core-blockchain/blockchain.test.ts @@ -128,12 +128,12 @@ describe("Blockchain", () => { expect(blockchain.getLastBlock()).toEqual(lastBlock); }); - it("should broadcast a block if (Crypto.slots.getSlotNumber() * blocktime <= block.data.timestamp)", async () => { + it("should broadcast a block if (Crypto.Slots.getSlotNumber() * blocktime <= block.data.timestamp)", async () => { blockchain.state.started = true; const mockCallback = jest.fn(() => true); const lastBlock = blockchain.getLastBlock(); - lastBlock.data.timestamp = Crypto.slots.getSlotNumber() * 8000; + lastBlock.data.timestamp = Crypto.Slots.getSlotNumber() * 8000; const broadcastBlock = jest.spyOn(getMonitor, "broadcastBlock"); @@ -167,7 +167,7 @@ describe("Blockchain", () => { const block = { height: 100, - timestamp: Crypto.slots.getEpochTime(), + timestamp: Crypto.Slots.getTime(), }; // @ts-ignore @@ -189,7 +189,7 @@ describe("Blockchain", () => { const block = { height: 100, - timestamp: Crypto.slots.getSlotTime(Crypto.slots.getNextSlot()), + timestamp: Crypto.Slots.getSlotTime(Crypto.Slots.getNextSlot()), }; // @ts-ignore @@ -207,7 +207,7 @@ describe("Blockchain", () => { const loggerInfo = jest.spyOn(logger, "info"); const mockGetSlotNumber = jest - .spyOn(Crypto.slots, "getSlotNumber") + .spyOn(Crypto.Slots, "getSlotNumber") .mockReturnValueOnce(1) .mockReturnValueOnce(1); @@ -242,7 +242,7 @@ describe("Blockchain", () => { expect( blockchain.isSynced({ data: { - timestamp: Crypto.slots.getTime(), + timestamp: Crypto.Slots.getTime(), height: genesisBlock.height, }, } as Interfaces.IBlock), @@ -256,7 +256,7 @@ describe("Blockchain", () => { const getLastBlock = jest.spyOn(blockchain, "getLastBlock").mockReturnValueOnce({ // @ts-ignore data: { - timestamp: Crypto.slots.getTime(), + timestamp: Crypto.Slots.getTime(), height: genesisBlock.height, }, }); diff --git a/__tests__/unit/core-blockchain/state-machine.test.ts b/__tests__/unit/core-blockchain/state-machine.test.ts index 703e2d1c05..212bc6fced 100644 --- a/__tests__/unit/core-blockchain/state-machine.test.ts +++ b/__tests__/unit/core-blockchain/state-machine.test.ts @@ -264,7 +264,7 @@ describe("State Machine", () => { // @ts-ignore data: { height: 2, - timestamp: Crypto.slots.getTime(), + timestamp: Crypto.Slots.getTime(), }, }); // @ts-ignore diff --git a/__tests__/unit/core-p2p/socket-server/versions/internal/handlers/rounds.test.ts b/__tests__/unit/core-p2p/socket-server/versions/internal/handlers/rounds.test.ts index 8769b186bb..a3e90421dd 100644 --- a/__tests__/unit/core-p2p/socket-server/versions/internal/handlers/rounds.test.ts +++ b/__tests__/unit/core-p2p/socket-server/versions/internal/handlers/rounds.test.ts @@ -6,7 +6,7 @@ import { delegates } from "../../../../../../utils/fixtures/testnet/delegates"; import { Crypto } from "@arkecosystem/crypto"; const timestampSlots = 104; -Crypto.slots.getTime = jest.fn().mockReturnValue(timestampSlots); +Crypto.Slots.getTime = jest.fn().mockReturnValue(timestampSlots); describe("Internal handlers - rounds", () => { describe("getCurrentRound", () => { diff --git a/__tests__/unit/core-p2p/socket-server/versions/peer/index.test.ts b/__tests__/unit/core-p2p/socket-server/versions/peer/index.test.ts index 65444a0a8f..f62a675eba 100644 --- a/__tests__/unit/core-p2p/socket-server/versions/peer/index.test.ts +++ b/__tests__/unit/core-p2p/socket-server/versions/peer/index.test.ts @@ -84,8 +84,8 @@ describe("Peers handler", () => { describe("getStatus", () => { it("should return status", async () => { - Crypto.slots.isForgingAllowed = jest.fn().mockReturnValue(true); - Crypto.slots.getSlotNumber = jest.fn().mockReturnValue(3); + Crypto.Slots.isForgingAllowed = jest.fn().mockReturnValue(true); + Crypto.Slots.getSlotNumber = jest.fn().mockReturnValue(3); const result = await getStatus(); diff --git a/__tests__/unit/core-transaction-pool/connection.test.ts b/__tests__/unit/core-transaction-pool/connection.test.ts index e2bbb420ae..53ae2f6a62 100644 --- a/__tests__/unit/core-transaction-pool/connection.test.ts +++ b/__tests__/unit/core-transaction-pool/connection.test.ts @@ -22,7 +22,7 @@ import { database as databaseService } from "./mocks/database"; const { BlockFactory } = Blocks; const { SATOSHI } = Constants; -const { slots } = Crypto; +const { Slots } = Crypto; const { TransactionTypes } = Enums; const delegatesSecrets = delegates.map(d => d.secret); @@ -218,7 +218,7 @@ describe("Connection", () => { expect(connection.getPoolSize()).toBe(0); const expireAfterSeconds = 3; - const expiration = slots.getTime() + expireAfterSeconds; + const expiration = Slots.getTime() + expireAfterSeconds; const transactions: Interfaces.ITransaction[] = []; diff --git a/__tests__/unit/core-transactions/handler-registry.test.ts b/__tests__/unit/core-transactions/handler-registry.test.ts index aec28acff1..9120486fee 100644 --- a/__tests__/unit/core-transactions/handler-registry.test.ts +++ b/__tests__/unit/core-transactions/handler-registry.test.ts @@ -9,7 +9,7 @@ import { testnet } from "../../../packages/crypto/src/networks"; const { transactionBaseSchema, extend } = Transactions.schemas; const { TransactionTypes } = Enums; -const { slots } = Crypto; +const { Slots } = Crypto; const TEST_TRANSACTION_TYPE = 100; @@ -117,7 +117,7 @@ describe("TransactionHandlerRegistry", () => { const keys = Identities.Keys.fromPassphrase("secret"); const data: Interfaces.ITransactionData = { type: TEST_TRANSACTION_TYPE, - timestamp: slots.getTime(), + timestamp: Slots.getTime(), senderPublicKey: keys.publicKey, fee: Utils.BigNumber.make("10000000"), amount: Utils.BigNumber.make("200000000"), diff --git a/__tests__/unit/core-utils/is-blocked-chained.test.ts b/__tests__/unit/core-utils/is-blocked-chained.test.ts index f49d512a04..90912a38b2 100644 --- a/__tests__/unit/core-utils/is-blocked-chained.test.ts +++ b/__tests__/unit/core-utils/is-blocked-chained.test.ts @@ -7,14 +7,14 @@ describe("isChained", () => { it("should be ok", () => { const previousBlock = { id: "1", - timestamp: Crypto.slots.getSlotTime(0), + timestamp: Crypto.Slots.getSlotTime(0), height: 1, previousBlock: null, } as Interfaces.IBlockData; const nextBlock = { id: "2", - timestamp: Crypto.slots.getSlotTime(1), + timestamp: Crypto.Slots.getSlotTime(1), height: 2, previousBlock: "1", } as Interfaces.IBlockData; @@ -25,14 +25,14 @@ describe("isChained", () => { it("should not chain when previous block does not match", () => { const previousBlock = { id: "2", - timestamp: Crypto.slots.getSlotTime(0), + timestamp: Crypto.Slots.getSlotTime(0), height: 2, previousBlock: null, } as Interfaces.IBlockData; const nextBlock = { id: "1", - timestamp: Crypto.slots.getSlotTime(1), + timestamp: Crypto.Slots.getSlotTime(1), height: 3, previousBlock: "1", } as Interfaces.IBlockData; @@ -43,14 +43,14 @@ describe("isChained", () => { it("should not chain when next height is not plus 1", () => { const previousBlock = { id: "1", - timestamp: Crypto.slots.getSlotTime(0), + timestamp: Crypto.Slots.getSlotTime(0), height: 1, previousBlock: null, } as Interfaces.IBlockData; const nextBlock = { id: "2", - timestamp: Crypto.slots.getSlotTime(1), + timestamp: Crypto.Slots.getSlotTime(1), height: 3, previousBlock: "1", } as Interfaces.IBlockData; @@ -61,14 +61,14 @@ describe("isChained", () => { it("should not chain when same slot", () => { const previousBlock = { id: "1", - timestamp: Crypto.slots.getSlotTime(0), + timestamp: Crypto.Slots.getSlotTime(0), height: 1, previousBlock: null, } as Interfaces.IBlockData; const nextBlock = { id: "2", - timestamp: Crypto.slots.getSlotTime(0), + timestamp: Crypto.Slots.getSlotTime(0), height: 3, previousBlock: "1", } as Interfaces.IBlockData; @@ -79,14 +79,14 @@ describe("isChained", () => { it("should not chain when lower slot", () => { const previousBlock = { id: "1", - timestamp: Crypto.slots.getSlotTime(1), + timestamp: Crypto.Slots.getSlotTime(1), height: 1, previousBlock: null, } as Interfaces.IBlockData; const nextBlock = { id: "2", - timestamp: Crypto.slots.getSlotTime(0), + timestamp: Crypto.Slots.getSlotTime(0), height: 3, previousBlock: "1", } as Interfaces.IBlockData; diff --git a/__tests__/unit/crypto/blocks/block.test.ts b/__tests__/unit/crypto/blocks/block.test.ts index 979f528f4f..38d5c75aa2 100644 --- a/__tests__/unit/crypto/blocks/block.test.ts +++ b/__tests__/unit/crypto/blocks/block.test.ts @@ -4,7 +4,7 @@ import { Interfaces, Utils } from "@arkecosystem/crypto"; import ByteBuffer from "bytebuffer"; import { Delegate } from "../../../../packages/core-forger/src/delegate"; import { Block, BlockFactory } from "../../../../packages/crypto/src/blocks"; -import { slots } from "../../../../packages/crypto/src/crypto"; +import { Slots } from "../../../../packages/crypto/src/crypto"; import { IBlock } from "../../../../packages/crypto/src/interfaces"; import { configManager } from "../../../../packages/crypto/src/managers"; import * as networks from "../../../../packages/crypto/src/networks"; @@ -75,7 +75,7 @@ describe("Block", () => { }); it("should fail to verify a block with incorrect timestamp", () => { - jest.spyOn(slots, "getSlotNumber").mockImplementation(timestamp => (timestamp ? 2 : 0)); + jest.spyOn(Slots, "getSlotNumber").mockImplementation(timestamp => (timestamp ? 2 : 0)); const block = BlockFactory.fromData(dummyBlock); expect(block.verification.verified).toBeFalse(); @@ -148,7 +148,7 @@ describe("Block", () => { it("should fail to verify a block if error is thrown", () => { const errorMessage = "Very very, very bad error"; - jest.spyOn(slots, "getSlotNumber").mockImplementation(height => { + jest.spyOn(Slots, "getSlotNumber").mockImplementation(height => { throw errorMessage; }); const block = BlockFactory.fromData(dummyBlock); diff --git a/__tests__/unit/crypto/crypto/slots.test.ts b/__tests__/unit/crypto/crypto/slots.test.ts index 68e021719a..ebdf35ef4d 100644 --- a/__tests__/unit/crypto/crypto/slots.test.ts +++ b/__tests__/unit/crypto/crypto/slots.test.ts @@ -1,79 +1,51 @@ import "jest-extended"; -import { slots } from "../../../../packages/crypto/src/crypto/slots"; +import { Slots } from "../../../../packages/crypto/src/crypto/slots"; import { configManager } from "../../../../packages/crypto/src/managers/config"; import { devnet } from "../../../../packages/crypto/src/networks"; beforeEach(() => configManager.setConfig(devnet)); describe("Slots", () => { - describe("getEpochTime", () => { - it("return epoch datetime", () => { - expect(slots.getEpochTime()).toBeNumber(); - }); - }); - - describe("beginEpochTime", () => { - it("return epoch datetime", () => { - expect(slots.beginEpochTime().toISO()).toBe("2017-03-21T13:00:00.000Z"); - }); - - it("return epoch unix", () => { - expect(slots.beginEpochTime().toUnix()).toBe(1490101200); - }); - }); - describe("getTime", () => { it("return epoch time as number", () => { - const result = slots.getTime(1490101210000); + const result = Slots.getTime(1490101210000); expect(result).toBeNumber(); expect(result).toEqual(10); }); }); - describe("getRealTime", () => { - it("return real time", () => { - expect(slots.getRealTime(10)).toBe(1490101210000); - }); - - it("should call this.getTime when called without time", () => { - const getTime = jest.spyOn(slots, "getTime"); - slots.getRealTime(undefined); - expect(getTime).toHaveBeenCalledTimes(1); - }); - }); - describe("getSlotNumber", () => { it("return slot number", () => { - expect(slots.getSlotNumber(10)).toBe(1); + expect(Slots.getSlotNumber(10)).toBe(1); }); }); describe("getSlotTime", () => { it("returns slot time", () => { - expect(slots.getSlotTime(19614)).toBe(156912); + expect(Slots.getSlotTime(19614)).toBe(156912); }); }); describe("getNextSlot", () => { it("returns next slot", () => { - expect(slots.getNextSlot()).toBeNumber(); + expect(Slots.getNextSlot()).toBeNumber(); }); }); describe("isForgingAllowed", () => { it("returns boolean", () => { - expect(slots.isForgingAllowed()).toBeDefined(); + expect(Slots.isForgingAllowed()).toBeDefined(); }); }); describe("getTimeInMsUntilNextSlot", () => { it("should be ok", () => { - const nextSlotTime = slots.getSlotTime(slots.getNextSlot()); - const now = slots.getTime(); + const nextSlotTime = Slots.getSlotTime(Slots.getNextSlot()); + const now = Slots.getTime(); - expect(slots.getTimeInMsUntilNextSlot()).toEqual((nextSlotTime - now) * 1000); + expect(Slots.getTimeInMsUntilNextSlot()).toEqual((nextSlotTime - now) * 1000); }); }); }); diff --git a/__tests__/unit/crypto/transactions/builders/transactions/__shared__/transaction-builder.ts b/__tests__/unit/crypto/transactions/builders/transactions/__shared__/transaction-builder.ts index ef72888f71..c482ed286e 100644 --- a/__tests__/unit/crypto/transactions/builders/transactions/__shared__/transaction-builder.ts +++ b/__tests__/unit/crypto/transactions/builders/transactions/__shared__/transaction-builder.ts @@ -1,4 +1,4 @@ -import { slots } from "../../../../../../../packages/crypto/src/crypto"; +import { Slots } from "../../../../../../../packages/crypto/src/crypto"; import { Keys } from "../../../../../../../packages/crypto/src/identities"; import { Transaction } from "../../../../../../../packages/crypto/src/transactions"; import { TransactionBuilder } from "../../../../../../../packages/crypto/src/transactions/builders/transactions/transaction"; @@ -24,7 +24,7 @@ export const transactionBuilder = >(provider: () let data; beforeEach(() => { - timestamp = slots.getTime(); + timestamp = Slots.getTime(); data = { id: "02d0d835266297f15c192be2636eb3fbc30b39b87fc583ff112062ef8dae1a1f", diff --git a/packages/core-api/src/versions/1/delegates/controller.ts b/packages/core-api/src/versions/1/delegates/controller.ts index f85c6b1e73..7e61c25ae8 100644 --- a/packages/core-api/src/versions/1/delegates/controller.ts +++ b/packages/core-api/src/versions/1/delegates/controller.ts @@ -94,7 +94,7 @@ export class DelegatesController extends Controller { const limit = request.query.limit || 10; const delegatesCount = this.config.getMilestone(lastBlock).activeDelegates; - const currentSlot = Crypto.slots.getSlotNumber(lastBlock.data.timestamp); + const currentSlot = Crypto.Slots.getSlotNumber(lastBlock.data.timestamp); const roundInfo = roundCalculator.calculateRound(lastBlock.data.height); const activeDelegates = await this.databaseService.getActiveDelegates(roundInfo); diff --git a/packages/core-blockchain/src/blockchain.ts b/packages/core-blockchain/src/blockchain.ts index 1fd13184da..3453751e62 100644 --- a/packages/core-blockchain/src/blockchain.ts +++ b/packages/core-blockchain/src/blockchain.ts @@ -245,8 +245,8 @@ export class Blockchain implements blockchain.IBlockchain { )} from ${remoteAddress}`, ); - const currentSlot: number = Crypto.slots.getSlotNumber(); - const receivedSlot: number = Crypto.slots.getSlotNumber(block.timestamp); + const currentSlot: number = Crypto.Slots.getSlotNumber(); + const receivedSlot: number = Crypto.Slots.getSlotNumber(block.timestamp); if (receivedSlot > currentSlot) { logger.info(`Discarded block ${block.height.toLocaleString()} because it takes a future slot.`); @@ -377,7 +377,7 @@ export class Blockchain implements blockchain.IBlockchain { // broadcast only current block const blocktime: number = config.getMilestone(block.data.height).blocktime; - if (this.state.started && Crypto.slots.getSlotNumber() * blocktime <= block.data.timestamp) { + if (this.state.started && Crypto.Slots.getSlotNumber() * blocktime <= block.data.timestamp) { this.p2p.getMonitor().broadcastBlock(block); } } @@ -441,7 +441,7 @@ export class Blockchain implements blockchain.IBlockchain { block = block || this.getLastBlock(); - return Crypto.slots.getTime() - block.data.timestamp < 3 * config.getMilestone(block.data.height).blocktime; + return Crypto.Slots.getTime() - block.data.timestamp < 3 * config.getMilestone(block.data.height).blocktime; } /** diff --git a/packages/core-blockchain/src/utils/validate-generator.ts b/packages/core-blockchain/src/utils/validate-generator.ts index 3cba2c3b4f..4034b1b444 100644 --- a/packages/core-blockchain/src/utils/validate-generator.ts +++ b/packages/core-blockchain/src/utils/validate-generator.ts @@ -9,7 +9,7 @@ export async function validateGenerator(block: Interfaces.IBlock): Promise { const blockTime = config.getMilestone(height).blocktime; const reward = config.getMilestone(height).reward; const delegates = await databaseService.getActiveDelegates(roundInfo); - const timestamp = Crypto.slots.getTime(); - const blockTimestamp = Crypto.slots.getSlotNumber(timestamp) * blockTime; + const timestamp = Crypto.Slots.getTime(); + const blockTimestamp = Crypto.Slots.getSlotNumber(timestamp) * blockTime; const currentForger = parseInt((timestamp / blockTime) as any) % maxDelegates; const nextForger = (parseInt((timestamp / blockTime) as any) + 1) % maxDelegates; diff --git a/packages/core-p2p/src/socket-server/versions/peer.ts b/packages/core-p2p/src/socket-server/versions/peer.ts index 44067e7fe5..85365d4814 100644 --- a/packages/core-p2p/src/socket-server/versions/peer.ts +++ b/packages/core-p2p/src/socket-server/versions/peer.ts @@ -49,8 +49,8 @@ export async function getStatus(): Promise { return { height: lastBlock ? lastBlock.data.height : 0, - forgingAllowed: Crypto.slots.isForgingAllowed(), - currentSlot: Crypto.slots.getSlotNumber(), + forgingAllowed: Crypto.Slots.isForgingAllowed(), + currentSlot: Crypto.Slots.getSlotNumber(), header: lastBlock ? lastBlock.getHeader() : {}, }; } diff --git a/packages/core-tester-cli/src/commands/make/block.ts b/packages/core-tester-cli/src/commands/make/block.ts index cae63e13bf..7f9ccd6e24 100644 --- a/packages/core-tester-cli/src/commands/make/block.ts +++ b/packages/core-tester-cli/src/commands/make/block.ts @@ -74,7 +74,7 @@ export class BlockCommand extends BaseCommand { const newBlock = await delegate.forge(transactions, { previousBlock, - timestamp: Crypto.slots.getSlotNumber(Crypto.slots.getTime()) * milestone.blocktime, + timestamp: Crypto.Slots.getSlotNumber(Crypto.Slots.getTime()) * milestone.blocktime, reward: milestone.reward, }); diff --git a/packages/core-transaction-pool/src/memory.ts b/packages/core-transaction-pool/src/memory.ts index 695546daf6..f3f26b62f5 100644 --- a/packages/core-transaction-pool/src/memory.ts +++ b/packages/core-transaction-pool/src/memory.ts @@ -54,7 +54,7 @@ export class Memory { this.byExpirationIsSorted = true; } - const now: number = Crypto.slots.getTime(); + const now: number = Crypto.Slots.getTime(); const transactions: Interfaces.ITransaction[] = []; for (const MemoryTransaction of this.byExpiration) { diff --git a/packages/core-transaction-pool/src/processor.ts b/packages/core-transaction-pool/src/processor.ts index b2dba247d5..b9182291e3 100644 --- a/packages/core-transaction-pool/src/processor.ts +++ b/packages/core-transaction-pool/src/processor.ts @@ -166,7 +166,7 @@ export class Processor implements TransactionPool.IProcessor { } private validateTransaction(transaction: Interfaces.ITransactionData): boolean { - const now: number = Crypto.slots.getTime(); + const now: number = Crypto.Slots.getTime(); if (transaction.timestamp > now + 3600) { const secondsInFuture: number = transaction.timestamp - now; diff --git a/packages/core-utils/src/is-block-chained.ts b/packages/core-utils/src/is-block-chained.ts index 160b0d99ae..d47373a954 100644 --- a/packages/core-utils/src/is-block-chained.ts +++ b/packages/core-utils/src/is-block-chained.ts @@ -4,8 +4,8 @@ export function isBlockChained(previousBlock: Interfaces.IBlockData, nextBlock: const followsPrevious: boolean = nextBlock.previousBlock === previousBlock.id; const isPlusOne: boolean = nextBlock.height === previousBlock.height + 1; - const previousSlot: number = Crypto.slots.getSlotNumber(previousBlock.timestamp); - const nextSlot: number = Crypto.slots.getSlotNumber(nextBlock.timestamp); + const previousSlot: number = Crypto.Slots.getSlotNumber(previousBlock.timestamp); + const nextSlot: number = Crypto.Slots.getSlotNumber(nextBlock.timestamp); const isAfterPreviousSlot: boolean = previousSlot < nextSlot; return followsPrevious && isPlusOne && isAfterPreviousSlot; diff --git a/packages/crypto/src/blocks/block.ts b/packages/crypto/src/blocks/block.ts index 763cc9b703..ba815d735f 100644 --- a/packages/crypto/src/blocks/block.ts +++ b/packages/crypto/src/blocks/block.ts @@ -1,4 +1,4 @@ -import { Hash, HashAlgorithms, slots } from "../crypto"; +import { Hash, HashAlgorithms, Slots } from "../crypto"; import { BlockSchemaError } from "../errors"; import { IBlock, IBlockData, IBlockJson, IBlockVerification, ITransaction, ITransactionData } from "../interfaces"; import { configManager } from "../managers/config"; @@ -159,7 +159,7 @@ export class Block implements IBlock { result.errors.push("Invalid block version"); } - if (slots.getSlotNumber(block.timestamp) > slots.getSlotNumber()) { + if (Slots.getSlotNumber(block.timestamp) > Slots.getSlotNumber()) { result.errors.push("Invalid block timestamp"); } diff --git a/packages/crypto/src/crypto/index.ts b/packages/crypto/src/crypto/index.ts index d480d444bf..32b6eb30d6 100644 --- a/packages/crypto/src/crypto/index.ts +++ b/packages/crypto/src/crypto/index.ts @@ -5,4 +5,4 @@ export { Hash } from "./hash"; export { HashAlgorithms } from "./hash-algorithms"; export { HDWallet } from "./hdwallet"; export { Message } from "./message"; -export { slots } from "./slots"; +export { Slots } from "./slots"; diff --git a/packages/crypto/src/crypto/slots.ts b/packages/crypto/src/crypto/slots.ts index 155438c200..3f02b655a0 100644 --- a/packages/crypto/src/crypto/slots.ts +++ b/packages/crypto/src/crypto/slots.ts @@ -1,101 +1,47 @@ -import { dato, Dato } from "@faustbrian/dato"; +import { dato } from "@faustbrian/dato"; import { configManager } from "../managers"; -class Slots { - /** - * Get epoch time relative to beginning epoch time. - */ - public getEpochTime(time?: number): number { +export class Slots { + public static getTime(time?: number): number { if (time === undefined) { time = dato().toMilliseconds(); } - const start: number = this.beginEpochTime().toMilliseconds(); + const start: number = dato(configManager.getMilestone(1).epoch).toMilliseconds(); return Math.floor((time - start) / 1000); } - /** - * Get beginning epoch time. - */ - public beginEpochTime(): Dato { - return dato(this.getMilestone("epoch")); - } - - /** - * Get epoch time relative to beginning epoch time. - */ - public getTime(time?: number): number { - return this.getEpochTime(time); - } - - /** - * Get real time from relative epoch time. - */ - public getRealTime(epochTime?: number): number { - if (epochTime === undefined) { - epochTime = this.getTime(); - } - - const start: number = Math.floor(this.beginEpochTime().toMilliseconds() / 1000) * 1000; - - return start + epochTime * 1000; - } - - /** - * Time left until next slot. - */ - public getTimeInMsUntilNextSlot(): number { + public static getTimeInMsUntilNextSlot(): number { const nextSlotTime: number = this.getSlotTime(this.getNextSlot()); const now: number = this.getTime(); return (nextSlotTime - now) * 1000; } - /** - * Get the current slot number. - */ - public getSlotNumber(epochTime?: number): number { - if (epochTime === undefined) { - epochTime = this.getTime(); + public static getSlotNumber(epoch?: number): number { + if (epoch === undefined) { + epoch = this.getTime(); } - return Math.floor(epochTime / this.getMilestone("blocktime")); + return Math.floor(epoch / configManager.getMilestone(1).blocktime); } - /** - * Get the current slot time. - */ - public getSlotTime(slot: number): number { - return slot * this.getMilestone("blocktime"); + public static getSlotTime(slot: number): number { + return slot * configManager.getMilestone(1).blocktime; } - /** - * Get the next slot number. - */ - public getNextSlot(): number { + public static getNextSlot(): number { return this.getSlotNumber() + 1; } - /** - * Checks if forging is allowed - */ - public isForgingAllowed(epochTime?: number): boolean { - if (epochTime === undefined) { - epochTime = this.getTime(); + public static isForgingAllowed(epoch?: number): boolean { + if (epoch === undefined) { + epoch = this.getTime(); } - const blockTime: number = this.getMilestone("blocktime"); + const blockTime: number = configManager.getMilestone(1).blocktime; - return epochTime % blockTime < blockTime / 2; - } - - /** - * Get constant from height 1. - */ - private getMilestone(key: string): any { - return configManager.getMilestone(1)[key]; + return epoch % blockTime < blockTime / 2; } } - -export const slots = new Slots(); diff --git a/packages/crypto/src/transactions/builders/transactions/transaction.ts b/packages/crypto/src/transactions/builders/transactions/transaction.ts index 37460c42c5..92f65c6015 100644 --- a/packages/crypto/src/transactions/builders/transactions/transaction.ts +++ b/packages/crypto/src/transactions/builders/transactions/transaction.ts @@ -1,5 +1,5 @@ import { Transaction, TransactionFactory } from "../.."; -import { slots } from "../../../crypto"; +import { Slots } from "../../../crypto"; import { MissingTransactionSignatureError } from "../../../errors"; import { Address, Keys } from "../../../identities"; import { IKeyPair, ITransactionData } from "../../../interfaces"; @@ -15,7 +15,7 @@ export abstract class TransactionBuilder