diff --git a/.circleci/config.yml b/.circleci/config.yml index a71528c4a3..64ad9c254e 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -35,7 +35,6 @@ jobs: - ./packages/core/node_modules - ./packages/core-api/node_modules - ./packages/core-blockchain/node_modules - - ./packages/core-config/node_modules - ./packages/core-container/node_modules - ./packages/core-database/node_modules - ./packages/core-database-postgres/node_modules @@ -66,23 +65,26 @@ jobs: name: Create .ark/database directory command: mkdir -p $HOME/.ark/database - run: - name: core-utils - command: 'cd ~/ark-core/packages/core-utils && yarn test:coverage' + name: core-vote-report + command: 'cd ~/ark-core/packages/core-vote-report && yarn test:coverage' - run: - name: core-test-utils - command: 'cd ~/ark-core/packages/core-test-utils && yarn test:coverage' + name: core-tester-cli + command: 'cd ~/ark-core/packages/core-tester-cli && yarn test:coverage' - run: - name: core-p2p - command: 'cd ~/ark-core/packages/core-p2p && yarn test:coverage' + name: core-snapshots + command: 'cd ~/ark-core/packages/core-snapshots && yarn test:coverage' - run: - name: core-http-utils - command: 'cd ~/ark-core/packages/core-http-utils && yarn test:coverage' + name: core-logger + command: 'cd ~/ark-core/packages/core-logger && yarn test:coverage' - run: - name: core-event-emitter - command: 'cd ~/ark-core/packages/core-event-emitter && yarn test:coverage' + name: core-forger + command: 'cd ~/ark-core/packages/core-forger && yarn test:coverage' - run: - name: core-config - command: 'cd ~/ark-core/packages/core-config && yarn test:coverage' + name: core-debugger-cli + command: 'cd ~/ark-core/packages/core-debugger-cli && yarn test:coverage' + - run: + name: core-container + command: 'cd ~/ark-core/packages/core-container && yarn test:coverage' - run: name: core command: 'cd ~/ark-core/packages/core && yarn test:coverage' @@ -128,7 +130,6 @@ jobs: - ./packages/core/node_modules - ./packages/core-api/node_modules - ./packages/core-blockchain/node_modules - - ./packages/core-config/node_modules - ./packages/core-container/node_modules - ./packages/core-database/node_modules - ./packages/core-database-postgres/node_modules @@ -159,23 +160,26 @@ jobs: name: Create .ark/database directory command: mkdir -p $HOME/.ark/database - run: - name: core-utils - command: 'cd ~/ark-core/packages/core-utils && yarn test:coverage' + name: core-vote-report + command: 'cd ~/ark-core/packages/core-vote-report && yarn test:coverage' - run: - name: core-test-utils - command: 'cd ~/ark-core/packages/core-test-utils && yarn test:coverage' + name: core-tester-cli + command: 'cd ~/ark-core/packages/core-tester-cli && yarn test:coverage' - run: - name: core-p2p - command: 'cd ~/ark-core/packages/core-p2p && yarn test:coverage' + name: core-snapshots + command: 'cd ~/ark-core/packages/core-snapshots && yarn test:coverage' - run: - name: core-http-utils - command: 'cd ~/ark-core/packages/core-http-utils && yarn test:coverage' + name: core-logger + command: 'cd ~/ark-core/packages/core-logger && yarn test:coverage' - run: - name: core-event-emitter - command: 'cd ~/ark-core/packages/core-event-emitter && yarn test:coverage' + name: core-forger + command: 'cd ~/ark-core/packages/core-forger && yarn test:coverage' - run: - name: core-config - command: 'cd ~/ark-core/packages/core-config && yarn test:coverage' + name: core-debugger-cli + command: 'cd ~/ark-core/packages/core-debugger-cli && yarn test:coverage' + - run: + name: core-container + command: 'cd ~/ark-core/packages/core-container && yarn test:coverage' - run: name: core command: 'cd ~/ark-core/packages/core && yarn test:coverage' @@ -221,7 +225,6 @@ jobs: - ./packages/core/node_modules - ./packages/core-api/node_modules - ./packages/core-blockchain/node_modules - - ./packages/core-config/node_modules - ./packages/core-container/node_modules - ./packages/core-database/node_modules - ./packages/core-database-postgres/node_modules @@ -302,7 +305,6 @@ jobs: - ./packages/core/node_modules - ./packages/core-api/node_modules - ./packages/core-blockchain/node_modules - - ./packages/core-config/node_modules - ./packages/core-container/node_modules - ./packages/core-database/node_modules - ./packages/core-database-postgres/node_modules @@ -333,26 +335,23 @@ jobs: name: Create .ark/database directory command: mkdir -p $HOME/.ark/database - run: - name: core-vote-report - command: 'cd ~/ark-core/packages/core-vote-report && yarn test:coverage' - - run: - name: core-tester-cli - command: 'cd ~/ark-core/packages/core-tester-cli && yarn test:coverage' + name: core-webhooks + command: 'cd ~/ark-core/packages/core-webhooks && yarn test:coverage' - run: - name: core-snapshots - command: 'cd ~/ark-core/packages/core-snapshots && yarn test:coverage' + name: core-transaction-pool + command: 'cd ~/ark-core/packages/core-transaction-pool && yarn test:coverage' - run: - name: core-logger - command: 'cd ~/ark-core/packages/core-logger && yarn test:coverage' + name: core-logger-winston + command: 'cd ~/ark-core/packages/core-logger-winston && yarn test:coverage' - run: - name: core-forger - command: 'cd ~/ark-core/packages/core-forger && yarn test:coverage' + name: core-graphql + command: 'cd ~/ark-core/packages/core-graphql && yarn test:coverage' - run: - name: core-debugger-cli - command: 'cd ~/ark-core/packages/core-debugger-cli && yarn test:coverage' + name: core-deployer + command: 'cd ~/ark-core/packages/core-deployer && yarn test:coverage' - run: - name: core-container - command: 'cd ~/ark-core/packages/core-container && yarn test:coverage' + name: core-database + command: 'cd ~/ark-core/packages/core-database && yarn test:coverage' - run: name: core-api command: 'cd ~/ark-core/packages/core-api && yarn test:coverage' @@ -398,7 +397,6 @@ jobs: - ./packages/core/node_modules - ./packages/core-api/node_modules - ./packages/core-blockchain/node_modules - - ./packages/core-config/node_modules - ./packages/core-container/node_modules - ./packages/core-database/node_modules - ./packages/core-database-postgres/node_modules @@ -429,23 +427,20 @@ jobs: name: Create .ark/database directory command: mkdir -p $HOME/.ark/database - run: - name: core-webhooks - command: 'cd ~/ark-core/packages/core-webhooks && yarn test:coverage' - - run: - name: core-transaction-pool - command: 'cd ~/ark-core/packages/core-transaction-pool && yarn test:coverage' + name: core-utils + command: 'cd ~/ark-core/packages/core-utils && yarn test:coverage' - run: - name: core-logger-winston - command: 'cd ~/ark-core/packages/core-logger-winston && yarn test:coverage' + name: core-test-utils + command: 'cd ~/ark-core/packages/core-test-utils && yarn test:coverage' - run: - name: core-graphql - command: 'cd ~/ark-core/packages/core-graphql && yarn test:coverage' + name: core-p2p + command: 'cd ~/ark-core/packages/core-p2p && yarn test:coverage' - run: - name: core-deployer - command: 'cd ~/ark-core/packages/core-deployer && yarn test:coverage' + name: core-http-utils + command: 'cd ~/ark-core/packages/core-http-utils && yarn test:coverage' - run: - name: core-database - command: 'cd ~/ark-core/packages/core-database && yarn test:coverage' + name: core-event-emitter + command: 'cd ~/ark-core/packages/core-event-emitter && yarn test:coverage' - run: name: core-blockchain command: 'cd ~/ark-core/packages/core-blockchain && yarn test:coverage' @@ -491,7 +486,6 @@ jobs: - ./packages/core/node_modules - ./packages/core-api/node_modules - ./packages/core-blockchain/node_modules - - ./packages/core-config/node_modules - ./packages/core-container/node_modules - ./packages/core-database/node_modules - ./packages/core-database-postgres/node_modules @@ -572,7 +566,6 @@ jobs: - ./packages/core/node_modules - ./packages/core-api/node_modules - ./packages/core-blockchain/node_modules - - ./packages/core-config/node_modules - ./packages/core-container/node_modules - ./packages/core-database/node_modules - ./packages/core-database-postgres/node_modules @@ -603,26 +596,23 @@ jobs: name: Create .ark/database directory command: mkdir -p $HOME/.ark/database - run: - name: core-vote-report - command: 'cd ~/ark-core/packages/core-vote-report && yarn test:coverage' - - run: - name: core-tester-cli - command: 'cd ~/ark-core/packages/core-tester-cli && yarn test:coverage' + name: core-webhooks + command: 'cd ~/ark-core/packages/core-webhooks && yarn test:coverage' - run: - name: core-snapshots - command: 'cd ~/ark-core/packages/core-snapshots && yarn test:coverage' + name: core-transaction-pool + command: 'cd ~/ark-core/packages/core-transaction-pool && yarn test:coverage' - run: - name: core-logger - command: 'cd ~/ark-core/packages/core-logger && yarn test:coverage' + name: core-logger-winston + command: 'cd ~/ark-core/packages/core-logger-winston && yarn test:coverage' - run: - name: core-forger - command: 'cd ~/ark-core/packages/core-forger && yarn test:coverage' + name: core-graphql + command: 'cd ~/ark-core/packages/core-graphql && yarn test:coverage' - run: - name: core-debugger-cli - command: 'cd ~/ark-core/packages/core-debugger-cli && yarn test:coverage' + name: core-deployer + command: 'cd ~/ark-core/packages/core-deployer && yarn test:coverage' - run: - name: core-container - command: 'cd ~/ark-core/packages/core-container && yarn test:coverage' + name: core-database + command: 'cd ~/ark-core/packages/core-database && yarn test:coverage' - run: name: core-api command: 'cd ~/ark-core/packages/core-api && yarn test:coverage' @@ -668,7 +658,6 @@ jobs: - ./packages/core/node_modules - ./packages/core-api/node_modules - ./packages/core-blockchain/node_modules - - ./packages/core-config/node_modules - ./packages/core-container/node_modules - ./packages/core-database/node_modules - ./packages/core-database-postgres/node_modules @@ -699,23 +688,20 @@ jobs: name: Create .ark/database directory command: mkdir -p $HOME/.ark/database - run: - name: core-webhooks - command: 'cd ~/ark-core/packages/core-webhooks && yarn test:coverage' - - run: - name: core-transaction-pool - command: 'cd ~/ark-core/packages/core-transaction-pool && yarn test:coverage' + name: core-utils + command: 'cd ~/ark-core/packages/core-utils && yarn test:coverage' - run: - name: core-logger-winston - command: 'cd ~/ark-core/packages/core-logger-winston && yarn test:coverage' + name: core-test-utils + command: 'cd ~/ark-core/packages/core-test-utils && yarn test:coverage' - run: - name: core-graphql - command: 'cd ~/ark-core/packages/core-graphql && yarn test:coverage' + name: core-p2p + command: 'cd ~/ark-core/packages/core-p2p && yarn test:coverage' - run: - name: core-deployer - command: 'cd ~/ark-core/packages/core-deployer && yarn test:coverage' + name: core-http-utils + command: 'cd ~/ark-core/packages/core-http-utils && yarn test:coverage' - run: - name: core-database - command: 'cd ~/ark-core/packages/core-database && yarn test:coverage' + name: core-event-emitter + command: 'cd ~/ark-core/packages/core-event-emitter && yarn test:coverage' - run: name: core-blockchain command: 'cd ~/ark-core/packages/core-blockchain && yarn test:coverage' diff --git a/README.md b/README.md index b9782f0fb9..5f9cbc9fd3 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,6 @@ This repository contains all plugins that make up the Ark Core. | **[core](/packages/core)** | [![npm](https://badgen.now.sh/npm/v/@arkecosystem/core)](https://www.npmjs.com/package/@arkecosystem/core) | **Includes all packages** | | [core-api](/packages/core-api) | [![npm](https://badgen.now.sh/npm/v/@arkecosystem/core-api)](https://www.npmjs.com/package/@arkecosystem/core-api) | Public REST API | | [core-blockchain](/packages/core-blockchain) | [![npm](https://badgen.now.sh/npm/v/@arkecosystem/core-blockchain)](https://www.npmjs.com/package/@arkecosystem/core-blockchain) | Blockchain Managment | -| [core-config](/packages/core-config) | [![npm](https://badgen.now.sh/npm/v/@arkecosystem/core-config)](https://www.npmjs.com/package/@arkecosystem/core-config) | Configuration Loader | | [core-container](/packages/core-container) | [![npm](https://badgen.now.sh/npm/v/@arkecosystem/core-container)](https://www.npmjs.com/package/@arkecosystem/core-container) | Container Managment | | [core-database](/packages/core-database) | [![npm](https://badgen.now.sh/npm/v/@arkecosystem/core-database)](https://www.npmjs.com/package/@arkecosystem/core-database) | Database Interface | | [core-database-postgres](/packages/core-database-postgres) | [![npm](https://badgen.now.sh/npm/v/@arkecosystem/core-database-postgres)](https://www.npmjs.com/package/@arkecosystem/core-database-postgres) | Database Implementation - PostgreSQL | diff --git a/greenkeeper.json b/greenkeeper.json index 61011d404e..fb58a5347c 100644 --- a/greenkeeper.json +++ b/greenkeeper.json @@ -5,7 +5,6 @@ "package.json", "packages/core-api/package.json", "packages/core-blockchain/package.json", - "packages/core-config/package.json", "packages/core-container/package.json", "packages/core-database-postgres/package.json", "packages/core-database/package.json", diff --git a/packages/core-api/__tests__/repositories/transactions.test.ts b/packages/core-api/__tests__/repositories/transactions.test.ts index 661c8796de..71ffb478c4 100644 --- a/packages/core-api/__tests__/repositories/transactions.test.ts +++ b/packages/core-api/__tests__/repositories/transactions.test.ts @@ -14,8 +14,6 @@ beforeAll(async () => { repository = new TransactionsRepository(); - // Create the genesis block after the setup has finished or else it uses a potentially - // wrong network config. genesisTransaction = genesisBlock.transactions[0]; }); diff --git a/packages/core-api/__tests__/v1/handlers/blocks.test.ts b/packages/core-api/__tests__/v1/handlers/blocks.test.ts index 53f6e9f95b..c4f39662a3 100644 --- a/packages/core-api/__tests__/v1/handlers/blocks.test.ts +++ b/packages/core-api/__tests__/v1/handlers/blocks.test.ts @@ -1,3 +1,4 @@ +import { app } from "@arkecosystem/core-container"; import "@arkecosystem/core-test-utils"; import genesisBlock from "../../../../core-test-utils/src/config/testnet/genesisBlock.json"; import { setUp, tearDown } from "../../__support__/setup"; @@ -75,10 +76,9 @@ describe("API 1.0 - Blocks", () => { expect(response.data.nethash).toBeString(); - const { app: container } = require("@arkecosystem/core-container"); - const config = container.resolvePlugin("config"); + const config = app.getConfig(); - expect(response.data.nethash).toBe(config.network.nethash); + expect(response.data.nethash).toBe(config.get("network.nethash")); }); }); diff --git a/packages/core-api/__tests__/v2/handlers/delegates.test.ts b/packages/core-api/__tests__/v2/handlers/delegates.test.ts index 2098ca298b..681fdd82da 100644 --- a/packages/core-api/__tests__/v2/handlers/delegates.test.ts +++ b/packages/core-api/__tests__/v2/handlers/delegates.test.ts @@ -33,7 +33,7 @@ describe("API 2.0 - Delegates", () => { const response = await utils[request]("GET", "delegates"); expect(response).toBeSuccessfulResponse(); expect(response.data.data).toBeArray(); - expect(response.data.data.sort((a, b) => (a.rank < b.rank))).toEqual(response.data.data); + expect(response.data.data.sort((a, b) => a.rank < b.rank)).toEqual(response.data.data); utils.expectDelegate(response.data.data[0]); }); @@ -47,7 +47,7 @@ describe("API 2.0 - Delegates", () => { const response = await utils[request]("GET", "delegates", { orderBy: "rank:desc" }); expect(response).toBeSuccessfulResponse(); expect(response.data.data).toBeArray(); - expect(response.data.data.sort((a, b) => (a.rank > b.rank))).toEqual(response.data.data); + expect(response.data.data.sort((a, b) => a.rank > b.rank)).toEqual(response.data.data); utils.expectDelegate(response.data.data[0]); }); diff --git a/packages/core-api/src/plugins/validation/formats/address.ts b/packages/core-api/src/plugins/validation/formats/address.ts index 9239a82a6d..7e4ecc56d7 100644 --- a/packages/core-api/src/plugins/validation/formats/address.ts +++ b/packages/core-api/src/plugins/validation/formats/address.ts @@ -2,13 +2,13 @@ import { app } from "@arkecosystem/core-container"; import * as bs58check from "bs58check"; export function registerAddressFormat(ajv) { - const config = app.resolvePlugin("config"); + const config = app.getConfig(); ajv.addFormat("address", { type: "string", validate: value => { try { - return bs58check.decode(value)[0] === config.network.pubKeyHash; + return bs58check.decode(value)[0] === config.get("network.pubKeyHash"); } catch (e) { return false; } diff --git a/packages/core-api/src/repositories/transactions.ts b/packages/core-api/src/repositories/transactions.ts index ec4583b08a..8445fc3dc0 100644 --- a/packages/core-api/src/repositories/transactions.ts +++ b/packages/core-api/src/repositories/transactions.ts @@ -156,7 +156,7 @@ export class TransactionsRepository extends Repository implements IRepository { */ public async allVotesBySender(senderPublicKey, parameters: any = {}): Promise { return this.findAll({ - ...{ senderPublicKey, type: constants.TRANSACTION_TYPES.VOTE }, + ...{ senderPublicKey, type: constants.TransactionTypes.Vote }, ...parameters, }); } diff --git a/packages/core-api/src/versions/1/accounts/controller.ts b/packages/core-api/src/versions/1/accounts/controller.ts index 80b8ba1da3..0a07581518 100644 --- a/packages/core-api/src/versions/1/accounts/controller.ts +++ b/packages/core-api/src/versions/1/accounts/controller.ts @@ -11,7 +11,7 @@ export class AccountsController extends Controller { public constructor() { super(); - this.config = app.resolvePlugin("config"); + this.config = app.getConfig(); this.database = app.resolvePlugin("database"); this.blockchain = app.resolvePlugin("blockchain"); } @@ -59,7 +59,7 @@ export class AccountsController extends Controller { public async fee(request: Hapi.Request, h: Hapi.ResponseToolkit) { try { return super.respondWith({ - fee: this.config.getConstants(this.blockchain.getLastHeight()).fees.staticFees.delegateRegistration, + fee: this.config.getMilestone(this.blockchain.getLastHeight()).fees.staticFees.delegateRegistration, }); } catch (error) { return Boom.badImplementation(error); diff --git a/packages/core-api/src/versions/1/blocks/controller.ts b/packages/core-api/src/versions/1/blocks/controller.ts index 25fc2ece37..21cd44e14a 100644 --- a/packages/core-api/src/versions/1/blocks/controller.ts +++ b/packages/core-api/src/versions/1/blocks/controller.ts @@ -13,7 +13,7 @@ export class BlocksController extends Controller { super(); this.blockchain = app.resolvePlugin("blockchain"); - this.config = app.resolvePlugin("config"); + this.config = app.getConfig(); } public async index(request: Hapi.Request, h: Hapi.ResponseToolkit) { @@ -39,7 +39,7 @@ export class BlocksController extends Controller { public async epoch(request: Hapi.Request, h: Hapi.ResponseToolkit) { try { return super.respondWith({ - epoch: this.config.getConstants(this.blockchain.getLastHeight()).epoch, + epoch: this.config.getMilestone(this.blockchain.getLastHeight()).epoch, }); } catch (error) { return Boom.badImplementation(error); @@ -58,7 +58,7 @@ export class BlocksController extends Controller { public async nethash(request: Hapi.Request, h: Hapi.ResponseToolkit) { try { - return super.respondWith({ nethash: this.config.network.nethash }); + return super.respondWith({ nethash: this.config.get("network.nethash") }); } catch (error) { return Boom.badImplementation(error); } @@ -67,7 +67,7 @@ export class BlocksController extends Controller { public async fee(request: Hapi.Request, h: Hapi.ResponseToolkit) { try { return super.respondWith({ - fee: this.config.getConstants(this.blockchain.getLastHeight()).fees.staticFees.transfer, + fee: this.config.getMilestone(this.blockchain.getLastHeight()).fees.staticFees.transfer, }); } catch (error) { return Boom.badImplementation(error); @@ -77,7 +77,7 @@ export class BlocksController extends Controller { public async fees(request: Hapi.Request, h: Hapi.ResponseToolkit) { try { const lastHeight = this.blockchain.getLastHeight(); - const fees = this.config.getConstants(lastHeight).fees.staticFees; + const fees = this.config.getMilestone(lastHeight).fees.staticFees; return super.respondWith({ fees: { @@ -106,7 +106,7 @@ export class BlocksController extends Controller { public async reward(request: Hapi.Request, h: Hapi.ResponseToolkit) { try { return super.respondWith({ - reward: this.config.getConstants(this.blockchain.getLastHeight()).reward, + reward: this.config.getMilestone(this.blockchain.getLastHeight()).reward, }); } catch (error) { return Boom.badImplementation(error); @@ -116,11 +116,11 @@ export class BlocksController extends Controller { public async supply(request: Hapi.Request, h: Hapi.ResponseToolkit) { try { const lastBlock = this.blockchain.getLastBlock(); - const constants = this.config.getConstants(lastBlock.data.height); + const constants = this.config.getMilestone(lastBlock.data.height); const rewards = bignumify(constants.reward).times(lastBlock.data.height - constants.height); return super.respondWith({ - supply: +bignumify(this.config.genesisBlock.totalAmount) + supply: +bignumify(this.config.get("genesisBlock.totalAmount")) .plus(rewards) .toFixed(), }); @@ -132,7 +132,7 @@ export class BlocksController extends Controller { public async status(request: Hapi.Request, h: Hapi.ResponseToolkit) { try { const lastBlock = this.blockchain.getLastBlock(); - const constants = this.config.getConstants(lastBlock.data.height); + const constants = this.config.getMilestone(lastBlock.data.height); const rewards = bignumify(constants.reward).times(lastBlock.data.height - constants.height); return super.respondWith({ @@ -140,9 +140,9 @@ export class BlocksController extends Controller { height: lastBlock.data.height, fee: constants.fees.staticFees.transfer, milestone: Math.floor(lastBlock.data.height / 3000000), - nethash: this.config.network.nethash, + nethash: this.config.get("network.nethash"), reward: constants.reward, - supply: +bignumify(this.config.genesisBlock.totalAmount) + supply: +bignumify(this.config.get("genesisBlock.totalAmount")) .plus(rewards) .toFixed(), }); diff --git a/packages/core-api/src/versions/1/delegates/controller.ts b/packages/core-api/src/versions/1/delegates/controller.ts index 3e01aec517..511663c6fd 100644 --- a/packages/core-api/src/versions/1/delegates/controller.ts +++ b/packages/core-api/src/versions/1/delegates/controller.ts @@ -13,7 +13,7 @@ export class DelegatesController extends Controller { super(); this.blockchain = app.resolvePlugin("blockchain"); - this.config = app.resolvePlugin("config"); + this.config = app.getConfig(); this.database = app.resolvePlugin("database"); } @@ -70,7 +70,7 @@ export class DelegatesController extends Controller { public async fee(request: Hapi.Request, h: Hapi.ResponseToolkit) { try { return super.respondWith({ - fee: this.config.getConstants(this.blockchain.getLastHeight()).fees.staticFees.delegateRegistration, + fee: this.config.getMilestone(this.blockchain.getLastHeight()).fees.staticFees.delegateRegistration, }); } catch (error) { return Boom.badImplementation(error); @@ -100,7 +100,7 @@ export class DelegatesController extends Controller { // @ts-ignore const limit = request.query.limit || 10; - const delegatesCount = this.config.getConstants(lastBlock).activeDelegates; + const delegatesCount = this.config.getMilestone(lastBlock).activeDelegates; const currentSlot = slots.getSlotNumber(lastBlock.data.timestamp); let activeDelegates = await this.database.getActiveDelegates(lastBlock.data.height); diff --git a/packages/core-api/src/versions/1/delegates/schema.ts b/packages/core-api/src/versions/1/delegates/schema.ts index 463ddf0f11..2f43681f48 100644 --- a/packages/core-api/src/versions/1/delegates/schema.ts +++ b/packages/core-api/src/versions/1/delegates/schema.ts @@ -61,7 +61,7 @@ export const getDelegates: object = { limit: { type: "integer", minimum: 1, - maximum: lastBlock ? app.resolvePlugin("config").getConstants(lastBlock.data.height).activeDelegates : 51, + maximum: lastBlock ? app.getConfig().getMilestone(lastBlock.data.height).activeDelegates : 51, }, offset: { type: "integer", diff --git a/packages/core-api/src/versions/1/loader/controller.ts b/packages/core-api/src/versions/1/loader/controller.ts index e2362c057a..c5fba862f4 100644 --- a/packages/core-api/src/versions/1/loader/controller.ts +++ b/packages/core-api/src/versions/1/loader/controller.ts @@ -12,7 +12,7 @@ export class LoaderController extends Controller { super(); this.blockchain = app.resolvePlugin("blockchain"); - this.config = app.resolvePlugin("config"); + this.config = app.getConfig(); } public async index(request: Hapi.Request, h: Hapi.ResponseToolkit) { @@ -56,13 +56,15 @@ export class LoaderController extends Controller { try { const feeStatisticsData = await transactionsRepository.getFeeStatistics(); + const network = this.config.get("network"); + return super.respondWith({ network: { - nethash: this.config.network.nethash, - token: this.config.network.client.token, - symbol: this.config.network.client.symbol, - explorer: this.config.network.client.explorer, - version: this.config.network.pubKeyHash, + nethash: network.nethash, + token: network.client.token, + symbol: network.client.symbol, + explorer: network.client.explorer, + version: network.pubKeyHash, ports: super.toResource(request, this.config, "ports"), feeStatistics: super.toCollection(request, feeStatisticsData, "fee-statistics"), }, diff --git a/packages/core-api/src/versions/1/peers/transformer.ts b/packages/core-api/src/versions/1/peers/transformer.ts index e7f71d734a..6cd18d3d94 100644 --- a/packages/core-api/src/versions/1/peers/transformer.ts +++ b/packages/core-api/src/versions/1/peers/transformer.ts @@ -1,7 +1,7 @@ import { app } from "@arkecosystem/core-container"; export function transformPeerLegacy(model) { - const config = app.resolvePlugin("config"); + const config = app.getConfig(); const peer: any = { ip: model.ip, @@ -13,7 +13,7 @@ export function transformPeerLegacy(model) { delay: model.delay, }; - if (config.network.name !== "mainnet") { + if (config.get("network.name") !== "mainnet") { peer.hashid = model.hashid; } diff --git a/packages/core-api/src/versions/1/shared/transformers/ports.ts b/packages/core-api/src/versions/1/shared/transformers/ports.ts index bf4508d467..a19b5047eb 100644 --- a/packages/core-api/src/versions/1/shared/transformers/ports.ts +++ b/packages/core-api/src/versions/1/shared/transformers/ports.ts @@ -8,9 +8,11 @@ export function transformPortsLegacy(config: any) { "@arkecosystem/core-webhooks", ]; - result[keys[0]] = config.plugins[keys[0]].port; + const plugins = config.get("plugins"); - for (const [name, options] of Object.entries(config.plugins)) { + result[keys[0]] = plugins[keys[0]].port; + + for (const [name, options] of Object.entries(plugins)) { // @ts-ignore if (keys.includes(name) && options.enabled) { // @ts-ignore diff --git a/packages/core-api/src/versions/1/signatures/controller.ts b/packages/core-api/src/versions/1/signatures/controller.ts index 1c9df35696..116433e514 100644 --- a/packages/core-api/src/versions/1/signatures/controller.ts +++ b/packages/core-api/src/versions/1/signatures/controller.ts @@ -11,7 +11,7 @@ export class SignaturesController extends Controller { super(); this.blockchain = app.resolvePlugin("blockchain"); - this.config = app.resolvePlugin("config"); + this.config = app.getConfig(); } public async fee(request: Hapi.Request, h: Hapi.ResponseToolkit) { @@ -19,7 +19,7 @@ export class SignaturesController extends Controller { const height: number = this.blockchain.getLastHeight(); return super.respondWith({ - fee: this.config.getConstants(height).fees.staticFees.secondSignature, + fee: this.config.getMilestone(height).fees.staticFees.secondSignature, }); } catch (error) { return Boom.badImplementation(error); diff --git a/packages/core-api/src/versions/1/transactions/transformer.ts b/packages/core-api/src/versions/1/transactions/transformer.ts index e211a5ad64..8378cc51c9 100644 --- a/packages/core-api/src/versions/1/transactions/transformer.ts +++ b/packages/core-api/src/versions/1/transactions/transformer.ts @@ -3,7 +3,7 @@ import { bignumify } from "@arkecosystem/core-utils"; import { crypto, models } from "@arkecosystem/crypto"; export function transformTransactionLegacy(model) { - const config = app.resolvePlugin("config"); + const config = app.getConfig(); const blockchain = app.resolvePlugin("blockchain"); const data: any = new models.Transaction(model.serialized.toString("hex")); @@ -16,7 +16,7 @@ export function transformTransactionLegacy(model) { amount: +bignumify(data.amount).toFixed(), fee: +bignumify(data.fee).toFixed(), recipientId: data.recipientId, - senderId: crypto.getAddress(data.senderPublicKey, config.network.pubKeyHash), + senderId: crypto.getAddress(data.senderPublicKey, config.get("network.pubKeyHash")), senderPublicKey: data.senderPublicKey, vendorField: data.vendorField, signature: data.signature, diff --git a/packages/core-api/src/versions/2/blockchain/controller.ts b/packages/core-api/src/versions/2/blockchain/controller.ts index 4abbc778fd..06f3dcb336 100644 --- a/packages/core-api/src/versions/2/blockchain/controller.ts +++ b/packages/core-api/src/versions/2/blockchain/controller.ts @@ -11,7 +11,7 @@ export class BlockchainController extends Controller { public constructor() { super(); - this.config = app.resolvePlugin("config"); + this.config = app.getConfig(); this.blockchain = app.resolvePlugin("blockchain"); } diff --git a/packages/core-api/src/versions/2/node/controller.ts b/packages/core-api/src/versions/2/node/controller.ts index 5a11280ba3..fc8cb8cceb 100644 --- a/packages/core-api/src/versions/2/node/controller.ts +++ b/packages/core-api/src/versions/2/node/controller.ts @@ -11,7 +11,7 @@ export class NodeController extends Controller { public constructor() { super(); - this.config = app.resolvePlugin("config"); + this.config = app.getConfig(); this.blockchain = app.resolvePlugin("blockchain"); } @@ -54,15 +54,17 @@ export class NodeController extends Controller { try { const feeStatisticsData = await transactionsRepository.getFeeStatistics(); + const network = this.config.get("network"); + return { data: { - nethash: this.config.network.nethash, - token: this.config.network.client.token, - symbol: this.config.network.client.symbol, - explorer: this.config.network.client.explorer, - version: this.config.network.pubKeyHash, + nethash: network.nethash, + token: network.client.token, + symbol: network.client.symbol, + explorer: network.client.explorer, + version: network.pubKeyHash, ports: super.toResource(request, this.config, "ports"), - constants: this.config.getConstants(this.blockchain.getLastHeight()), + constants: this.config.getMilestone(this.blockchain.getLastHeight()), feeStatistics: super.toCollection(request, feeStatisticsData, "fee-statistics"), }, }; diff --git a/packages/core-api/src/versions/2/peers/transformer.ts b/packages/core-api/src/versions/2/peers/transformer.ts index 66d09edb30..f622f658a1 100644 --- a/packages/core-api/src/versions/2/peers/transformer.ts +++ b/packages/core-api/src/versions/2/peers/transformer.ts @@ -1,7 +1,7 @@ import { app } from "@arkecosystem/core-container"; export function transformPeer(model) { - const config = app.resolvePlugin("config"); + const config = app.getConfig(); const peer: any = { ip: model.ip, @@ -13,7 +13,7 @@ export function transformPeer(model) { latency: model.delay, }; - if (config.network.name !== "mainnet") { + if (config.get("network.name") !== "mainnet") { peer.hashid = model.hashid || "unknown"; } diff --git a/packages/core-api/src/versions/2/shared/transformers/ports.ts b/packages/core-api/src/versions/2/shared/transformers/ports.ts index 7188fa703c..eb16f318db 100644 --- a/packages/core-api/src/versions/2/shared/transformers/ports.ts +++ b/packages/core-api/src/versions/2/shared/transformers/ports.ts @@ -8,9 +8,11 @@ export function transformPorts(config: any) { "@arkecosystem/core-webhooks", ]; - result[keys[0]] = config.plugins[keys[0]].port; + const plugins = config.get("plugins"); - for (const [name, options] of Object.entries(config.plugins)) { + result[keys[0]] = plugins[keys[0]].port; + + for (const [name, options] of Object.entries(plugins)) { // @ts-ignore if (keys.includes(name) && options.enabled) { // @ts-ignore diff --git a/packages/core-api/src/versions/2/transactions/controller.ts b/packages/core-api/src/versions/2/transactions/controller.ts index 1fdfb8016b..f2eda2f1d8 100644 --- a/packages/core-api/src/versions/2/transactions/controller.ts +++ b/packages/core-api/src/versions/2/transactions/controller.ts @@ -18,7 +18,7 @@ export class TransactionsController extends Controller { super(); this.blockchain = app.resolvePlugin("blockchain"); - this.config = app.resolvePlugin("config"); + this.config = app.getConfig(); this.logger = app.resolvePlugin("logger"); this.transactionPool = app.resolvePlugin("transactionPool"); } @@ -130,7 +130,7 @@ export class TransactionsController extends Controller { public async types(request: Hapi.Request, h: Hapi.ResponseToolkit) { try { return { - data: constants.TRANSACTION_TYPES, + data: constants.TransactionTypes, }; } catch (error) { return Boom.badImplementation(error); @@ -140,7 +140,7 @@ export class TransactionsController extends Controller { public async fees(request: Hapi.Request, h: Hapi.ResponseToolkit) { try { return { - data: this.config.getConstants(this.blockchain.getLastHeight()).fees.staticFees, + data: this.config.getMilestone(this.blockchain.getLastHeight()).fees.staticFees, }; } catch (error) { return Boom.badImplementation(error); diff --git a/packages/core-api/src/versions/2/transactions/transformer.ts b/packages/core-api/src/versions/2/transactions/transformer.ts index 67838d385e..d193efe675 100644 --- a/packages/core-api/src/versions/2/transactions/transformer.ts +++ b/packages/core-api/src/versions/2/transactions/transformer.ts @@ -3,7 +3,7 @@ import { bignumify, formatTimestamp } from "@arkecosystem/core-utils"; import { crypto, models } from "@arkecosystem/crypto"; export function transformTransaction(model) { - const config = app.resolvePlugin("config"); + const config = app.getConfig(); const blockchain = app.resolvePlugin("blockchain"); const data: any = new models.Transaction(model.serialized.toString("hex")); @@ -16,7 +16,7 @@ export function transformTransaction(model) { type: data.type, amount: +bignumify(data.amount).toFixed(), fee: +bignumify(data.fee).toFixed(), - sender: crypto.getAddress(data.senderPublicKey, config.network.pubKeyHash), + sender: crypto.getAddress(data.senderPublicKey, config.get("network.pubKeyHash")), recipient: data.recipientId, signature: data.signature, signSignature: data.signSignature, diff --git a/packages/core-api/src/versions/2/votes/methods.ts b/packages/core-api/src/versions/2/votes/methods.ts index 0b4e339564..26ecc9be19 100644 --- a/packages/core-api/src/versions/2/votes/methods.ts +++ b/packages/core-api/src/versions/2/votes/methods.ts @@ -4,10 +4,10 @@ import { transactionsRepository } from "../../../repositories"; import { generateCacheKey, getCacheTimeout } from "../../utils"; import { paginate, respondWithResource, toPagination } from "../utils"; -const { TRANSACTION_TYPES } = constants; +const { TransactionTypes } = constants; const index = async request => { - const transactions = await transactionsRepository.findAllByType(TRANSACTION_TYPES.VOTE, { + const transactions = await transactionsRepository.findAllByType(TransactionTypes.Vote, { ...request.query, ...paginate(request), }); @@ -16,7 +16,7 @@ const index = async request => { }; const show = async request => { - const transaction = await transactionsRepository.findByTypeAndId(TRANSACTION_TYPES.VOTE, request.params.id); + const transaction = await transactionsRepository.findByTypeAndId(TransactionTypes.Vote, request.params.id); if (!transaction) { return Boom.notFound("Vote not found"); diff --git a/packages/core-blockchain/__tests__/blockchain.test.ts b/packages/core-blockchain/__tests__/blockchain.test.ts index dd0a9f87d4..2edccaf4ab 100644 --- a/packages/core-blockchain/__tests__/blockchain.test.ts +++ b/packages/core-blockchain/__tests__/blockchain.test.ts @@ -38,11 +38,11 @@ beforeAll(async () => { // wrong network config. genesisBlock = new Block(require("@arkecosystem/core-test-utils/src/config/testnet/genesisBlock.json")); - configManager = container.resolvePlugin("config"); + configManager = container.getConfig(); // Workaround: Add genesis transactions to the exceptions list, because they have a fee of 0 // and otherwise don't pass validation. - configManager.network.exceptions.transactions = genesisBlock.transactions.map(tx => tx.id); + configManager.set("exceptions.transactions", genesisBlock.transactions.map(tx => tx.id)); // Manually register the blockchain and start it await __start(); @@ -51,7 +51,7 @@ beforeAll(async () => { afterAll(async () => { axiosMock.reset(); - delete configManager.network.exceptions.transactions; + configManager.set("exceptions.transactions", []); await __resetToHeight1(); diff --git a/packages/core-blockchain/src/blockchain.ts b/packages/core-blockchain/src/blockchain.ts index b1cef15566..d2dacea215 100644 --- a/packages/core-blockchain/src/blockchain.ts +++ b/packages/core-blockchain/src/blockchain.ts @@ -8,7 +8,7 @@ import { ProcessQueue, Queue, RebuildQueue } from "./queue"; import { stateMachine } from "./state-machine"; const logger = app.resolvePlugin("logger"); -const config = app.resolvePlugin("config"); +const config = app.getConfig(); const emitter = app.resolvePlugin("event-emitter"); const { Block } = models; @@ -190,7 +190,7 @@ export class Blockchain { */ public async rollbackCurrentRound() { const height = this.state.getLastBlock().data.height; - const maxDelegates = config.getConstants(height).activeDelegates; + const maxDelegates = config.getMilestone(height).activeDelegates; const previousRound = Math.floor((height - 1) / maxDelegates); if (previousRound < 2) { @@ -394,7 +394,7 @@ export class Blockchain { try { // broadcast only current block - const blocktime = config.getConstants(block.data.height).blocktime; + const blocktime = config.getMilestone(block.data.height).blocktime; if (slots.getSlotNumber() * blocktime <= block.data.timestamp) { this.p2p.broadcastBlock(block); } @@ -562,7 +562,7 @@ export class Blockchain { block = block || this.getLastBlock(); - return slots.getTime() - block.data.timestamp < 3 * config.getConstants(block.data.height).blocktime; + return slots.getTime() - block.data.timestamp < 3 * config.getMilestone(block.data.height).blocktime; } /** @@ -582,7 +582,7 @@ export class Blockchain { // stop fast rebuild 7 days before the last network block return slots.getTime() - block.data.timestamp < 3600 * 24 * 7; - // return slots.getTime() - block.data.timestamp < 100 * config.getConstants(block.data.height).blocktime + // return slots.getTime() - block.data.timestamp < 100 * config.getMilestone(block.data.height).blocktime } /** diff --git a/packages/core-blockchain/src/state-machine.ts b/packages/core-blockchain/src/state-machine.ts index 65d2887b22..a53896bc27 100644 --- a/packages/core-blockchain/src/state-machine.ts +++ b/packages/core-blockchain/src/state-machine.ts @@ -14,7 +14,7 @@ import { tickSyncTracker } from "./utils/tick-sync-tracker"; import { Blockchain } from "./blockchain"; const { Block } = models; -const config = app.resolvePlugin("config"); +const config = app.getConfig(); const emitter = app.resolvePlugin("event-emitter"); const logger = app.resolvePlugin("logger"); @@ -164,9 +164,9 @@ blockchainMachine.actionMap = (blockchain: Blockchain) => ({ if (!block) { logger.warn("No block found in database :hushed:"); - block = new Block(config.genesisBlock); + block = new Block(config.get("genesisBlock")); - if (block.data.payloadHash !== config.network.nethash) { + if (block.data.payloadHash !== config.get("network.nethash")) { logger.error( "FATAL: The genesis block payload hash is different from configured the nethash :rotating_light:", ); @@ -201,7 +201,7 @@ blockchainMachine.actionMap = (blockchain: Blockchain) => ({ /** ******************************* * state machine data init * ******************************* */ - const constants = config.getConstants(block.data.height); + const constants = config.getMilestone(block.data.height); stateStorage.setLastBlock(block); stateStorage.lastDownloadedBlock = block; @@ -223,7 +223,7 @@ blockchainMachine.actionMap = (blockchain: Blockchain) => ({ if (process.env.NODE_ENV === "test") { logger.verbose("TEST SUITE DETECTED! SYNCING WALLETS AND STARTING IMMEDIATELY. :bangbang:"); - stateStorage.setLastBlock(new Block(config.genesisBlock)); + stateStorage.setLastBlock(new Block(config.get("genesisBlock"))); await blockchain.database.buildWallets(block.data.height); return blockchain.dispatch("STARTED"); diff --git a/packages/core-config/.gitattributes b/packages/core-config/.gitattributes deleted file mode 100644 index 60cc52db63..0000000000 --- a/packages/core-config/.gitattributes +++ /dev/null @@ -1,11 +0,0 @@ -# Path-based git attributes -# https://www.kernel.org/pub/software/scm/git/docs/gitattributes.html - -# Ignore all test and documentation with "export-ignore". -/.editorconfig export-ignore -/.gitattributes export-ignore -/.gitignore export-ignore -/.travis.yml export-ignore -/__tests__ export-ignore -/docs export-ignore -/README.md export-ignore diff --git a/packages/core-config/README.md b/packages/core-config/README.md deleted file mode 100644 index ceaf344ff4..0000000000 --- a/packages/core-config/README.md +++ /dev/null @@ -1,24 +0,0 @@ -# Ark Core - Configuration - -

- -

- -## Documentation - -You can find installation instructions and detailed instructions on how to use this package at the [dedicated documentation site](https://docs.ark.io/guidebook/core/plugins/core-config.html). - -## Security - -If you discover a security vulnerability within this package, please send an e-mail to security@ark.io. All security vulnerabilities will be promptly addressed. - -## Credits - -- [Brian Faust](https://github.com/faustbrian) -- [François-Xavier Thoorens](https://github.com/fix) -- [Joshua Noack](https://github.com/supaiku0) -- [All Contributors](../../../../contributors) - -## License - -[MIT](LICENSE) © [ArkEcosystem](https://ark.io) diff --git a/packages/core-config/__tests__/__stubs__/network.json b/packages/core-config/__tests__/__stubs__/network.json deleted file mode 100644 index cc00aa8c2d..0000000000 --- a/packages/core-config/__tests__/__stubs__/network.json +++ /dev/null @@ -1,64 +0,0 @@ -{ - "name": "devnet", - "messagePrefix": "ARK message:\n", - "bip32": { - "public": 46090600, - "private": 46089520 - }, - "pubKeyHash": 30, - "nethash": "578e820911f24e039733b45e4882b73e301f813a0d2c31330dafda84534ffa23", - "wif": 170, - "client": { - "token": "DARK", - "symbol": "DѦ", - "explorer": "https://dexplorer.ark.io" - }, - "constants": [ - { - "height": 1, - "reward": 0, - "activeDelegates": 51, - "blocktime": 8, - "block": { - "version": 0, - "maxTransactions": 150, - "maxPayload": 2097152 - }, - "epoch": "2017-03-21T13:00:00.000Z", - "fees": { - "dynamic": false, - "dynamicFees": { - "minFeePool": 1000, - "minFeeBroadcast": 1000, - "addonBytes": { - "transfer": 100, - "secondSignature": 250, - "delegateRegistration": 500, - "vote": 100, - "multiSignature": 500, - "ipfs": 250, - "timelockTransfer": 500, - "multiPayment": 500, - "delegateResignation": 500 - } - }, - "staticFees": { - "transfer": 10000000, - "secondSignature": 500000000, - "delegateRegistration": 2500000000, - "vote": 100000000, - "multiSignature": 500000000, - "ipfs": 0, - "timelockTransfer": 0, - "multiPayment": 0, - "delegateResignation": 0 - } - } - }, - { - "height": 75600, - "reward": 200000000 - } - ], - "exceptions": {} -} diff --git a/packages/core-config/__tests__/loader.test.ts b/packages/core-config/__tests__/loader.test.ts deleted file mode 100644 index 6a7b4f5b4f..0000000000 --- a/packages/core-config/__tests__/loader.test.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { resolve } from "path"; -import { Loader } from "../src/loader"; - -const stubConfigPath = resolve(__dirname, "./__stubs__"); - -const stubConfig = { - delegates: require("./__stubs__/delegates"), - genesisBlock: require("./__stubs__/genesisBlock"), - network: require("./__stubs__/network"), -}; - -let loader; -beforeEach(() => { - loader = new Loader(); - process.env.ARK_PATH_CONFIG = stubConfigPath; - process.env.ARK_NETWORK = JSON.stringify(stubConfig.network); -}); - -afterEach(() => { - delete process.env.ARK_PATH_CONFIG; -}); - -describe("Config Loader", () => { - it("should fail without a config", async () => { - try { - await loader.setUp(); - } catch (error) { - expect(error.message).toEqual("undefined (object) is required"); - } - }); - - it("should succeed with a config", async () => { - const result = await loader.setUp(stubConfig); - - expect(loader.delegates).toEqual(stubConfig.delegates); - expect(loader.genesisBlock).toEqual(stubConfig.genesisBlock); - expect(loader.network).toEqual(stubConfig.network); - }); -}); diff --git a/packages/core-config/package.json b/packages/core-config/package.json deleted file mode 100644 index e4eae703b7..0000000000 --- a/packages/core-config/package.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "name": "@arkecosystem/core-config", - "description": "Configuration Loader for Ark Core", - "version": "2.1.0", - "contributors": [ - "François-Xavier Thoorens ", - "Brian Faust " - ], - "license": "MIT", - "main": "dist/index.js", - "files": [ - "dist" - ], - "scripts": { - "prepublishOnly": "yarn test && yarn build", - "pretest": "yarn lint && yarn build", - "compile": "../../node_modules/typescript/bin/tsc", - "build": "yarn clean && yarn compile", - "build:watch": "yarn clean && yarn compile -w", - "clean": "del dist", - "docs": "../../node_modules/typedoc/bin/typedoc src --out docs", - "lint": "../../node_modules/tslint/bin/tslint -c ../../tslint.json 'src/**/*.ts' '__tests__/**/*.ts' --fix", - "test": "cross-env ARK_ENV=test jest --runInBand --forceExit", - "test:coverage": "cross-env ARK_ENV=test jest --coverage --coveragePathIgnorePatterns='/(defaults.ts|index.ts)$' --runInBand --forceExit", - "test:debug": "cross-env ARK_ENV=test node --inspect-brk ../../node_modules/.bin/jest --runInBand", - "test:watch": "cross-env ARK_ENV=test jest --runInBand --watch", - "test:watch:all": "cross-env ARK_ENV=test jest --runInBand --watchAll" - }, - "dependencies": { - "@arkecosystem/crypto": "^2.1.0", - "@types/fs-extra": "^5.0.4", - "axios": "^0.18.0", - "fs-extra": "^7.0.1" - }, - "publishConfig": { - "access": "public" - }, - "engines": { - "node": ">=10.x" - }, - "jest": { - "preset": "../../jest-preset.json" - } -} diff --git a/packages/core-config/src/index.ts b/packages/core-config/src/index.ts deleted file mode 100644 index 1e2d081d87..0000000000 --- a/packages/core-config/src/index.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Loader } from "./loader"; - -export const plugin = { - pkg: require("../package.json"), - alias: "config", - async register(container, options) { - const loader = new Loader(); - await loader.setUp(options); - - return loader; - }, -}; diff --git a/packages/core-config/src/loader.ts b/packages/core-config/src/loader.ts deleted file mode 100644 index e9aae67ca2..0000000000 --- a/packages/core-config/src/loader.ts +++ /dev/null @@ -1,134 +0,0 @@ -import { configManager } from "@arkecosystem/crypto"; -import { strictEqual } from "assert"; -import axios from "axios"; -import { existsSync, readdirSync, writeFileSync } from "fs-extra"; -import { basename, extname, resolve } from "path"; - -export class Loader { - public network: any; - public peers: any; - public delegates: any; - public genesisBlock: any; - - private options: any; - - /** - * Make the config instance. - * @param {Object} options - * @return {Loader} - */ - public async setUp(options: object = {}): Promise { - this.options = options; - this.network = JSON.parse(process.env.ARK_NETWORK); - - await this.__createFromDirectory(); - - this._validateConfig(); - - configManager.setConfig(this.network); - } - - /** - * Get constants for the specified height. - * @param {Number} height - * @return {void} - */ - public getConstants(height: number): void { - return configManager.getConstants(height); - } - - /** - * Load and bind the config. - * @return {void} - */ - public async __createFromDirectory(): Promise { - const files: Record = this.__getFiles(); - - this.__createBindings(files); - - await this.__buildPeers(files.peers); - } - - /** - * Bind the config values to the instance. - * @param {Object} files - * @return {void} - */ - public __createBindings(files: Record): void { - for (const [key, value] of Object.entries(files)) { - this[key] = require(value); - } - } - - /** - * Get all config files. - * @return {Object} - */ - public __getFiles(): Record { - const basePath = resolve(process.env.ARK_PATH_CONFIG); - - if (!existsSync(basePath)) { - throw new Error("An invalid configuration was provided or is inaccessible due to it's security settings."); - process.exit(1); - } - - const configTree = {}; - for (const file of readdirSync(basePath)) { - if ([".js", ".json"].includes(extname(file))) { - configTree[basename(file, extname(file))] = resolve(basePath, file); - } - } - - return configTree; - } - - /** - * Build the peer list either from a local file, remote file or object. - * @param {String} configFile - * @return {void} - */ - public async __buildPeers(configFile: string): Promise { - if (this.peers.sources) { - const output = require(configFile); - - for (const source of this.peers.sources) { - // Local File... - if (source.startsWith("/")) { - output.list = require(source); - - writeFileSync(configFile, JSON.stringify(output, null, 2)); - - break; - } - - // URL... - try { - const response = await axios.get(source); - - output.list = response.data; - - writeFileSync(configFile, JSON.stringify(output, null, 2)); - - break; - } catch (error) { - // - } - } - } - } - - /** - * Validate crucial parts of the configuration. - * @return {void} - */ - public _validateConfig(): void { - try { - strictEqual(Number.isInteger(this.network.pubKeyHash), true); - strictEqual(this.network.nethash.length, 64); - strictEqual(Number.isInteger(this.network.wif), true); - } catch (error) { - throw Error(error.message); - process.exit(1); - } - } -} diff --git a/packages/core-config/tsconfig.json b/packages/core-config/tsconfig.json deleted file mode 100644 index 0b089c5fa8..0000000000 --- a/packages/core-config/tsconfig.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "outDir": "dist" - }, - "include": ["src/**/**.ts"] -} diff --git a/packages/core-container/.gitignore b/packages/core-container/.gitignore index 5d1942c190..1269488f7f 100644 --- a/packages/core-container/.gitignore +++ b/packages/core-container/.gitignore @@ -1,2 +1 @@ -config data diff --git a/packages/core-config/__tests__/__stubs__/delegates.json b/packages/core-container/__tests__/__stubs__/config/delegates.json similarity index 100% rename from packages/core-config/__tests__/__stubs__/delegates.json rename to packages/core-container/__tests__/__stubs__/config/delegates.json diff --git a/packages/core-container/__tests__/__stubs__/config/dynamicFees.json b/packages/core-container/__tests__/__stubs__/config/dynamicFees.json new file mode 100644 index 0000000000..92af028d5d --- /dev/null +++ b/packages/core-container/__tests__/__stubs__/config/dynamicFees.json @@ -0,0 +1,16 @@ +{ + "enabled": true, + "minFeePool": 1000, + "minFeeBroadcast": 1000, + "addonBytes": { + "transfer": 100, + "secondSignature": 250, + "delegateRegistration": 400000, + "vote": 100, + "multiSignature": 500, + "ipfs": 250, + "timelockTransfer": 500, + "multiPayment": 500, + "delegateResignation": 400000 + } +} diff --git a/packages/core-container/__tests__/__stubs__/config/exceptions.json b/packages/core-container/__tests__/__stubs__/config/exceptions.json new file mode 100644 index 0000000000..0967ef424b --- /dev/null +++ b/packages/core-container/__tests__/__stubs__/config/exceptions.json @@ -0,0 +1 @@ +{} diff --git a/packages/core-config/__tests__/__stubs__/genesisBlock.json b/packages/core-container/__tests__/__stubs__/config/genesisBlock.json similarity index 100% rename from packages/core-config/__tests__/__stubs__/genesisBlock.json rename to packages/core-container/__tests__/__stubs__/config/genesisBlock.json diff --git a/packages/core-container/__tests__/__stubs__/config/milestones.json b/packages/core-container/__tests__/__stubs__/config/milestones.json new file mode 100644 index 0000000000..51c32313cf --- /dev/null +++ b/packages/core-container/__tests__/__stubs__/config/milestones.json @@ -0,0 +1,31 @@ +[ + { + "height": 1, + "reward": 0, + "activeDelegates": 51, + "blocktime": 8, + "block": { + "version": 0, + "maxTransactions": 150, + "maxPayload": 2097152 + }, + "epoch": "2017-03-21T13:00:00.000Z", + "fees": { + "staticFees": { + "transfer": 10000000, + "secondSignature": 500000000, + "delegateRegistration": 2500000000, + "vote": 100000000, + "multiSignature": 500000000, + "ipfs": 0, + "timelockTransfer": 0, + "multiPayment": 0, + "delegateResignation": 0 + } + } + }, + { + "height": 75600, + "reward": 200000000 + } +] diff --git a/packages/core-container/__tests__/__stubs__/config/network.json b/packages/core-container/__tests__/__stubs__/config/network.json new file mode 100644 index 0000000000..0f373e462e --- /dev/null +++ b/packages/core-container/__tests__/__stubs__/config/network.json @@ -0,0 +1,17 @@ +{ + "name": "testnet", + "messagePrefix": "TEST message:\n", + "bip32": { + "public": 70617039, + "private": 70615956 + }, + "pubKeyHash": 23, + "nethash": "d9acd04bde4234a81addb8482333b4ac906bed7be5a9970ce8ada428bd083192", + "wif": 186, + "aip20": 0, + "client": { + "token": "TARK", + "symbol": "TѦ", + "explorer": "http://texplorer.ark.io" + } +} diff --git a/packages/core-config/__tests__/__stubs__/peers.json b/packages/core-container/__tests__/__stubs__/config/peers.json similarity index 100% rename from packages/core-config/__tests__/__stubs__/peers.json rename to packages/core-container/__tests__/__stubs__/config/peers.json diff --git a/packages/core-container/__tests__/__stubs__/config/plugins.js b/packages/core-container/__tests__/__stubs__/config/plugins.js new file mode 100644 index 0000000000..2647260229 --- /dev/null +++ b/packages/core-container/__tests__/__stubs__/config/plugins.js @@ -0,0 +1,12 @@ +module.exports = { + "./plugin-a": { + enabled: true, + }, + "./plugin-b": { + enabled: true, + property: "value", + }, + "./plugin-c": { + enabled: true, + }, +}; diff --git a/packages/core-container/__tests__/config/loaders/file-loader.test.ts b/packages/core-container/__tests__/config/loaders/file-loader.test.ts new file mode 100644 index 0000000000..7826d82b13 --- /dev/null +++ b/packages/core-container/__tests__/config/loaders/file-loader.test.ts @@ -0,0 +1,39 @@ +import "jest-extended"; + +import { resolve } from "path"; +import { fileLoader } from "../../../src/config/loaders"; +import { Network } from "../../../src/config/network"; + +const stubConfigPath = resolve(__dirname, "../../__stubs__/config"); + +const stubConfig = { + delegates: require(resolve(__dirname, "../../__stubs__/config/delegates")), + exceptions: require(resolve(__dirname, "../../__stubs__/config/exceptions")), + genesisBlock: require(resolve(__dirname, "../../__stubs__/config/genesisBlock")), + milestones: require(resolve(__dirname, "../../__stubs__/config/milestones")), + network: require(resolve(__dirname, "../../__stubs__/config/network")), + peers: require(resolve(__dirname, "../../__stubs__/config/peers")), + plugins: require(resolve(__dirname, "../../__stubs__/config/plugins")), +}; + +beforeEach(() => { + process.env.ARK_PATH_CONFIG = stubConfigPath; +}); + +afterEach(() => { + delete process.env.ARK_PATH_CONFIG; +}); + +describe("File Loader", () => { + it("should fail without a config", async () => { + await expect(fileLoader.setUp(null)).rejects.toThrowError("Invalid network configuration provided."); + }); + + it("should succeed with a config", async () => { + const { config } = await fileLoader.setUp(Network.setUp({})); + + expect(config.delegates).toEqual(stubConfig.delegates); + expect(config.genesisBlock).toEqual(stubConfig.genesisBlock); + expect(config.peers).toEqual(stubConfig.peers); + }); +}); diff --git a/packages/core-container/__tests__/remote-loader.test.ts b/packages/core-container/__tests__/config/loaders/remote-loader.test.ts similarity index 95% rename from packages/core-container/__tests__/remote-loader.test.ts rename to packages/core-container/__tests__/config/loaders/remote-loader.test.ts index 6174b2635d..7033b2eaf0 100644 --- a/packages/core-container/__tests__/remote-loader.test.ts +++ b/packages/core-container/__tests__/config/loaders/remote-loader.test.ts @@ -5,7 +5,7 @@ import * as mockProcess from "jest-mock-process"; import axios from "axios"; import MockAdapter from "axios-mock-adapter"; -import { RemoteLoader } from "../src/remote-loader"; +import { RemoteLoader } from "../../../src/config/loaders"; const axiosMock = new MockAdapter(axios); const configDir = "./__test-remote-config__"; @@ -28,7 +28,7 @@ afterEach(() => { axiosMock.reset(); }); -describe("Remote Loader", () => { +describe.skip("Remote Loader", () => { it("should ensure the config directory exists", () => { expect(pathExistsSync(testSubject.config)).toBeTrue(); }); @@ -48,7 +48,7 @@ describe("Remote Loader", () => { axiosMock.onGet("http://127.0.0.1:4002/config/network").reply(() => [ 200, { - data: require("../../crypto/src/networks/ark/devnet.json"), + data: require("../../crypto/src/networks/devnet.json"), }, ]); diff --git a/packages/core-container/package.json b/packages/core-container/package.json index e38723477f..ff46db6c08 100644 --- a/packages/core-container/package.json +++ b/packages/core-container/package.json @@ -29,7 +29,10 @@ "@arkecosystem/crypto": "^2.1.0", "@types/fs-extra": "^5.0.4", "@types/hoek": "^4.1.3", + "@types/joi": "^14.0.1", + "@types/lodash.get": "^4.4.4", "@types/lodash.isstring": "^4.0.4", + "@types/lodash.set": "^4.3.4", "@types/semver": "^5.5.0", "awilix": "^4.0.1", "axios": "^0.18.0", @@ -38,7 +41,10 @@ "expand-home-dir": "^0.0.3", "fs-extra": "^7.0.1", "hoek": "^6.1.1", + "joi": "^14.3.0", + "lodash.get": "^4.4.2", "lodash.isstring": "^4.0.1", + "lodash.set": "^4.3.2", "semver": "^5.6.0" }, "devDependencies": { diff --git a/packages/core-container/src/config/index.ts b/packages/core-container/src/config/index.ts new file mode 100644 index 0000000000..8204b7acbb --- /dev/null +++ b/packages/core-container/src/config/index.ts @@ -0,0 +1,61 @@ +import { configManager as crypto } from "@arkecosystem/crypto"; +import get from "lodash/get"; +import set from "lodash/set"; +import { fileLoader, RemoteLoader } from "./loaders"; +import { Network } from "./network"; + +class Config { + private config: Record; + + public async setUp(opts) { + if (opts.remote) { + const remoteLoader = new RemoteLoader(opts); + await remoteLoader.setUp(); + } + + const network = Network.setUp(opts); + + const { config, files } = await fileLoader.setUp(network); + + this.config = files; + + this.configureCrypto(network); + + return this; + } + + public all(): any { + return this.config; + } + + public get(key: string, defaultValue: any = null): any { + return get(this.config, key, defaultValue); + } + + public set(key: string, value: any): void { + set(this.config, key, value); + } + + /** + * Get constants for the specified height. + * @param {Number} height + * @return {void} + */ + public getMilestone(height: number): void { + return crypto.getMilestone(height); + } + + /** + * Configure the @arkecosystem/crypto package. + * @return {void} + */ + private configureCrypto(value: any): void { + crypto.setConfig(value); + + this.config.network = crypto.all(); + this.config.exceptions = crypto.get("exceptions"); + this.config.milestones = crypto.get("milestones"); + } +} + +export const configManager = new Config(); diff --git a/packages/core-container/src/config/loaders/file-loader.ts b/packages/core-container/src/config/loaders/file-loader.ts new file mode 100644 index 0000000000..7205290780 --- /dev/null +++ b/packages/core-container/src/config/loaders/file-loader.ts @@ -0,0 +1,103 @@ +import { configManager } from "@arkecosystem/crypto"; +import axios from "axios"; +import { existsSync, readdirSync, writeFileSync } from "fs-extra"; +import Joi from "joi"; +import get from "lodash/get"; +import set from "lodash/set"; +import { basename, extname, resolve } from "path"; +import { schemaConfig } from "../schema"; + +class FileLoader { + /** + * Make the config instance. + * @param {Object} opts + * @return {Loader} + */ + public async setUp(opts) { + if (!opts) { + throw new Error("Invalid network configuration provided."); + } + + const files = await this.createFromDirectory(); + + const { value, error } = Joi.validate(files, schemaConfig); + + if (error) { + throw error; + } + + return { config: value, files }; + } + + /** + * Load and bind the config. + * @return {void} + */ + private async createFromDirectory() { + const files: Record = this.getFiles(); + + for (const [key, value] of Object.entries(files)) { + files[key] = require(value); + } + + await this.buildPeers(files.peers); + + return files; + } + + /** + * Get all config files. + * @return {Object} + */ + private getFiles(): Record { + const basePath = resolve(process.env.ARK_PATH_CONFIG); + + if (!existsSync(basePath)) { + throw new Error("An invalid configuration was provided or is inaccessible due to it's security settings."); + } + + const configTree = {}; + for (const file of readdirSync(basePath)) { + if ([".js", ".json"].includes(extname(file))) { + configTree[basename(file, extname(file))] = resolve(basePath, file); + } + } + + return configTree; + } + + /** + * Build the peer list either from a local file, remote file or object. + * @param {String} configFile + * @return {void} + */ + private async buildPeers(configFile: any): Promise { + if (configFile.sources) { + for (const source of configFile.sources) { + // Local File... + if (source.startsWith("/")) { + configFile.list = require(source); + + writeFileSync(configFile, JSON.stringify(configFile, null, 2)); + + break; + } + + // URL... + try { + const response = await axios.get(source); + + configFile.list = response.data; + + writeFileSync(configFile, JSON.stringify(configFile, null, 2)); + + break; + } catch (error) { + // + } + } + } + } +} + +export const fileLoader = new FileLoader(); diff --git a/packages/core-container/src/config/loaders/index.ts b/packages/core-container/src/config/loaders/index.ts new file mode 100644 index 0000000000..d53018b463 --- /dev/null +++ b/packages/core-container/src/config/loaders/index.ts @@ -0,0 +1,4 @@ +import { fileLoader } from "./file-loader"; +import { RemoteLoader } from "./remote-loader"; + +export { fileLoader, RemoteLoader }; diff --git a/packages/core-container/src/remote-loader.ts b/packages/core-container/src/config/loaders/remote-loader.ts similarity index 56% rename from packages/core-container/src/remote-loader.ts rename to packages/core-container/src/config/loaders/remote-loader.ts index 9a89584bfb..2008c96d47 100644 --- a/packages/core-container/src/remote-loader.ts +++ b/packages/core-container/src/config/loaders/remote-loader.ts @@ -8,42 +8,60 @@ import { resolve } from "path"; export class RemoteLoader { private remote: any; private config: any; - private data: any; constructor(variables) { this.remote = variables.remote; this.config = expandHomeDir(variables.config); - this.data = expandHomeDir(variables.data); ensureDirSync(this.config); } public async setUp() { - const network = await this.__configureNetwork(); + const network = await this.configureNetwork(); - await this.__configureGenesisBlock(); + await this.configureExceptions(); - await this.__configurePeers(); + await this.configureMilestones(); - await this.__configureDelegates(); + await this.configureGenesisBlock(); - this.__configurePlugins(network); + await this.configurePeers(); - this.__configureDatabase(network); + await this.configureDelegates(); + + this.configurePlugins(network); + + this.configureDatabase(network); } - public async __configureNetwork() { - const network = await this.__getConfig("network"); + private async configureNetwork() { + const network = await this.getConfig("network"); - this.__writeConfig("network", network); + this.writeConfig("network", network); return network; } - public async __configureGenesisBlock() { + private async configureExceptions() { + const exceptions = await this.getConfig("exceptions"); + + this.writeConfig("exceptions", exceptions); + + return exceptions; + } + + private async configureMilestones() { + const milestones = await this.getConfig("milestones"); + + this.writeConfig("milestones", milestones); + + return milestones; + } + + private async configureGenesisBlock() { const { Block } = models; - const genesisBlock = await this.__getConfig("genesis-block"); + const genesisBlock = await this.getConfig("genesis-block"); const genesisBlockModel = new Block(genesisBlock); if (!genesisBlockModel.verification.verified) { @@ -52,28 +70,28 @@ export class RemoteLoader { process.exit(1); } - this.__writeConfig("genesisBlock", genesisBlock); + this.writeConfig("genesisBlock", genesisBlock); } - public async __configurePeers() { - const peers = await this.__getConfig("peers"); + private async configurePeers() { + const peers = await this.getConfig("peers"); - this.__writeConfig("peers", peers); + this.writeConfig("peers", peers); } - public async __configureDelegates() { - const delegates = await this.__getConfig("delegates"); + private async configureDelegates() { + const delegates = await this.getConfig("delegates"); - this.__writeConfig("delegates", delegates); + this.writeConfig("delegates", delegates); } - public __configurePlugins(network) { + private configurePlugins(network) { const plugins = resolve(__dirname, `../../core/src/config/${network.name}/plugins.js`); copySync(plugins, `${this.config}/plugins.js`); } - public __configureDatabase(network) { + private configureDatabase(network) { const command = spawnSync("createdb", [`ark_${network.name}`]); if (command.stderr.length > 0) { @@ -86,7 +104,7 @@ export class RemoteLoader { console.info(command.stdout.toString()); } - public async __getConfig(type) { + private async getConfig(type) { try { const { data } = await axios.get(`http://${this.remote}/config/${type}`, { headers: { "Content-Type": "application/json" }, @@ -94,7 +112,7 @@ export class RemoteLoader { return data.data; } catch (error) { - if (!this.__exists(type)) { + if (!this.exists(type)) { // tslint:disable-next-line:no-console console.error(error.message); process.exit(1); @@ -102,11 +120,11 @@ export class RemoteLoader { } } - public __writeConfig(file, data) { + private writeConfig(file, data) { writeFileSync(`${this.config}/${file}.json`, JSON.stringify(data, null, 4)); } - public __exists(file) { + private exists(file) { return existsSync(`${this.config}/${file}.json`); } } diff --git a/packages/core-container/src/config/network.ts b/packages/core-container/src/config/network.ts new file mode 100644 index 0000000000..357bb10cbd --- /dev/null +++ b/packages/core-container/src/config/network.ts @@ -0,0 +1,48 @@ +import { NetworkManager } from "@arkecosystem/crypto"; +import expandHomeDir from "expand-home-dir"; +import { existsSync } from "fs"; +import Joi from "joi"; +import { resolve } from "path"; +import { schemaNetwork } from "./schema"; + +export class Network { + /** + * Expose information about the for the operating network to the environment. + * @return {void} + */ + public static setUp(opts: any) { + let config; + + // Default configuration... + if (opts.network) { + config = NetworkManager.findByName(opts.network); + } else { + try { + const networkPath = resolve(expandHomeDir(process.env.ARK_PATH_CONFIG)); + + config = { + exceptions: require(`${networkPath}/exceptions`), + milestones: require(`${networkPath}/milestones`), + network: require(`${networkPath}/network`), + }; + } catch (error) { + config = false; + } + } + + // Validate the configuration... + const { error } = Joi.validate(config, schemaNetwork); + + if (error) { + throw new Error( + `An invalid network configuration was provided or is inaccessible due to it's security settings. ${ + error.message + }.`, + ); + } + + process.env.ARK_NETWORK_NAME = config.network.name; + + return config; + } +} diff --git a/packages/core-container/src/config/schema.ts b/packages/core-container/src/config/schema.ts new file mode 100644 index 0000000000..2ee5bc4020 --- /dev/null +++ b/packages/core-container/src/config/schema.ts @@ -0,0 +1,62 @@ +import Joi from "joi"; + +export const schemaNetwork = Joi.object({ + milestones: Joi.array() + .items(Joi.object()) + .required(), + exceptions: Joi.object({ + blocks: Joi.array().items(Joi.string()), + transactions: Joi.array().items(Joi.string()), + outlookTable: Joi.object(), + transactionIdFixTable: Joi.object(), + }).default({ exceptions: {} }), + network: Joi.object({ + name: Joi.string().required(), + messagePrefix: Joi.string().required(), + bip32: Joi.object({ + public: Joi.number() + .positive() + .required(), + private: Joi.number() + .positive() + .required(), + }), + pubKeyHash: Joi.number() + .positive() + .required(), + nethash: Joi.string() + .hex() + .required(), + wif: Joi.number() + .positive() + .required(), + aip20: Joi.number().required(), + client: Joi.object({ + token: Joi.string().required(), + symbol: Joi.string().required(), + explorer: Joi.string().required(), + }), + }).required(), +}); + +export const schemaConfig = Joi.object({ + delegates: Joi.object({ + secrets: Joi.array().items(Joi.string()), + bip38: Joi.string(), + }), + peers: Joi.object().required(), + peers_backup: Joi.array().items(Joi.object()), + // peers_backup: Joi.array().items( + // Joi.object().keys({ + // ip: Joi.string() + // .ip() + // .required(), + // port: Joi.number() + // .port() + // .required(), + // version: Joi.string().required(), + // }), + // ), + plugins: Joi.object().required(), + genesisBlock: Joi.object().required(), +}).unknown(); diff --git a/packages/core-container/src/container.ts b/packages/core-container/src/container.ts index 1a44bd1661..8fd1dc5a77 100644 --- a/packages/core-container/src/container.ts +++ b/packages/core-container/src/container.ts @@ -1,20 +1,23 @@ import { createContainer } from "awilix"; +import { execSync } from "child_process"; import delay from "delay"; import semver from "semver"; +import { configManager } from "./config"; import { Environment } from "./environment"; import { PluginRegistrar } from "./registrars/plugin"; -import { RemoteLoader } from "./remote-loader"; export class Container { public container: any; + public options: any; public exitEvents: any; public silentShutdown: boolean; public hashid: string; - public env: Environment; public plugins: any; public shuttingDown: boolean; public version: string; public isReady: boolean = false; + public variables: any; + public config: any; /** * Create a new container instance. @@ -22,7 +25,6 @@ export class Container { */ constructor() { this.container = createContainer(); - this.exitEvents = ["SIGINT", "exit"]; /** * May be used by CLI programs to suppress the shutdown @@ -35,13 +37,17 @@ export class Container { * easily idenfity nodes based on their commit hash and version. */ try { - this.hashid = require("child_process") - .execSync("git rev-parse --short=8 HEAD") + this.hashid = execSync("git rev-parse --short=8 HEAD") .toString() .trim(); } catch (e) { this.hashid = "unknown"; } + + /** + * Register any exit signal handling. + */ + this.registerExitHandler(["SIGINT", "exit"]); } /** @@ -51,23 +57,24 @@ export class Container { * @param {Object} options * @return {void} */ - public async setUp(version, variables, options: any = {}) { - this.__registerExitHandler(); + public async setUp(version: string, variables: any, options: any = {}) { + this.options = options; + this.variables = variables; this.setVersion(version); - if (variables.remote) { - const remoteLoader = new RemoteLoader(variables); - await remoteLoader.setUp(); - } - - this.env = new Environment(variables); - this.env.setUp(); + // Register the environment variables + new Environment(variables).setUp(); + // Mainly used for testing environments! if (options.skipPlugins) { + this.isReady = true; return; } + // Setup the configuration + this.config = await configManager.setUp(variables); + // TODO: Move this out eventually - not really the responsibility of the container this.plugins = new PluginRegistrar(this, options); await this.plugins.setUp(); @@ -75,12 +82,18 @@ export class Container { this.isReady = true; } + public getConfig() { + return this.config; + } + /** * Tear down the app. * @return {Promise} */ public async tearDown() { - await this.plugins.tearDown(); + if (!this.options.skipPlugins) { + await this.plugins.tearDown(); + } this.isReady = false; } @@ -223,7 +236,7 @@ export class Container { * Handle any exit signals. * @return {void} */ - public __registerExitHandler() { + private registerExitHandler(exitEvents: string[]) { const handleExit = async () => { if (this.shuttingDown) { return; @@ -260,6 +273,6 @@ export class Container { }; // Handle exit events - this.exitEvents.forEach(eventType => process.on(eventType, handleExit)); + exitEvents.forEach(eventType => process.on(eventType as any, handleExit)); } } diff --git a/packages/core-container/src/environment.ts b/packages/core-container/src/environment.ts index 95cc8c9bad..2e8074897e 100644 --- a/packages/core-container/src/environment.ts +++ b/packages/core-container/src/environment.ts @@ -4,31 +4,26 @@ import { existsSync } from "fs-extra"; import { resolve } from "path"; export class Environment { - private variables: any; - /** * Create a new environment instance. * @param {Object} variables * @return {void} */ - constructor(variables) { - this.variables = variables; - } + constructor(readonly variables: any) {} /** * Set up the environment variables. */ public setUp() { - this.__exportPaths(); - this.__exportNetwork(); - this.__exportVariables(); + this.exportPaths(); + this.exportVariables(); } /** * Export all path variables for the core environment. * @return {void} */ - public __exportPaths() { + private exportPaths() { const allowedKeys = ["config", "data"]; for (const [key, value] of Object.entries(this.variables)) { @@ -38,43 +33,12 @@ export class Environment { } } - /** - * Export all network variables for the core environment. - * @return {void} - */ - public __exportNetwork() { - let config; - - if (this.variables.token && this.variables.network) { - config = NetworkManager.findByName(this.variables.network, this.variables.token); - } else { - try { - const networkPath = resolve(expandHomeDir(`${process.env.ARK_PATH_CONFIG}/network.json`)); - - config = require(networkPath); - } catch (error) { - config = false; - } - } - - if (!config) { - throw new Error( - "An invalid network configuration was provided or is inaccessible due to it's security settings.", - ); - process.exit(1); - } - - process.env.ARK_NETWORK = JSON.stringify(config); - process.env.ARK_NETWORK_NAME = config.name; - } - /** * Export all additional variables for the core environment. * @return {void} */ - public __exportVariables() { - // Don't pollute the test environment, which is more in line with how - // travis runs the tests. + private exportVariables() { + // Don't pollute the test environment! if (process.env.NODE_ENV === "test") { return; } diff --git a/packages/core-container/src/registrars/plugin.ts b/packages/core-container/src/registrars/plugin.ts index 9fc810596d..60dc217a1f 100644 --- a/packages/core-container/src/registrars/plugin.ts +++ b/packages/core-container/src/registrars/plugin.ts @@ -225,6 +225,5 @@ export class PluginRegistrar { } throw new Error("An invalid configuration was provided or is inaccessible due to it's security settings."); - process.exit(1); } } diff --git a/packages/core-database-postgres/src/connection.ts b/packages/core-database-postgres/src/connection.ts index 72ecfe82b1..6af5a7140e 100644 --- a/packages/core-database-postgres/src/connection.ts +++ b/packages/core-database-postgres/src/connection.ts @@ -172,7 +172,7 @@ export class PostgresConnection extends ConnectionInterface { * @return {Array} */ public async getActiveDelegates(height, delegates) { - const maxDelegates = this.config.getConstants(height).activeDelegates; + const maxDelegates = this.config.getMilestone(height).activeDelegates; const round = Math.floor((height - 1) / maxDelegates) + 1; if (this.forgingDelegates && this.forgingDelegates.length && this.forgingDelegates[0].round === round) { diff --git a/packages/core-database-postgres/src/spv.ts b/packages/core-database-postgres/src/spv.ts index 5287d9751f..c1ea4ba18e 100644 --- a/packages/core-database-postgres/src/spv.ts +++ b/packages/core-database-postgres/src/spv.ts @@ -5,9 +5,9 @@ import { app } from "@arkecosystem/core-container"; import { queries } from "./queries"; const logger = app.resolvePlugin("logger"); -const config = app.resolvePlugin("config"); +const config = app.getConfig(); -const genesisWallets = config.genesisBlock.transactions.map(tx => tx.senderId); +const genesisWallets = config.get("genesisBlock.transactions").map(tx => tx.senderId); export class SPV { private connection: any; @@ -34,7 +34,7 @@ export class SPV { * @return {void} */ public async build(height) { - this.activeDelegates = config.getConstants(height).activeDelegates; + this.activeDelegates = config.getMilestone(height).activeDelegates; logger.printTracker("SPV", 1, 8, "Received Transactions"); await this.__buildReceivedTransactions(); diff --git a/packages/core-database/__tests__/interface.test.ts b/packages/core-database/__tests__/interface.test.ts index fd38acf1ab..9a37d39a2e 100644 --- a/packages/core-database/__tests__/interface.test.ts +++ b/packages/core-database/__tests__/interface.test.ts @@ -5,7 +5,7 @@ import { setUp, tearDown } from "./__support__/setup"; const { Block, Transaction, Wallet } = models; -const { ARKTOSHI, TRANSACTION_TYPES } = constants; +const { ARKTOSHI, TransactionTypes } = constants; let connectionInterface; let genesisBlock; @@ -42,7 +42,7 @@ describe("Connection Interface", () => { // Create delegates for (const transaction of genesisBlock.transactions) { - if (transaction.type === TRANSACTION_TYPES.DELEGATE_REGISTRATION) { + if (transaction.type === TransactionTypes.DelegateRegistration) { const wallet = walletManager.findByPublicKey(transaction.senderPublicKey); wallet.username = Transaction.deserialize( transaction.serialized.toString("hex"), diff --git a/packages/core-database/__tests__/repositories/delegates.test.ts b/packages/core-database/__tests__/repositories/delegates.test.ts index 35525ebc8f..13cf34d10d 100644 --- a/packages/core-database/__tests__/repositories/delegates.test.ts +++ b/packages/core-database/__tests__/repositories/delegates.test.ts @@ -77,7 +77,7 @@ describe("Delegate Repository", () => { const { count, rows } = repository.findAll(); expect(count).toBe(52); expect(rows).toHaveLength(52); - expect(rows.sort((a, b) => (a.rate < b.rate))).toEqual(rows); + expect(rows.sort((a, b) => a.rate < b.rate)).toEqual(rows); }); it("should be ok with params", () => { @@ -87,7 +87,7 @@ describe("Delegate Repository", () => { const { count, rows } = repository.findAll({ offset: 10, limit: 10, orderBy: "rate:desc" }); expect(count).toBe(52); expect(rows).toHaveLength(10); - expect(rows.sort((a, b) => (a.rate > b.rate))).toEqual(rows); + expect(rows.sort((a, b) => a.rate > b.rate)).toEqual(rows); }); it("should be ok with params (no offset)", () => { @@ -126,7 +126,7 @@ describe("Delegate Repository", () => { const { count, rows } = repository.paginate(); expect(count).toBe(52); expect(rows).toHaveLength(52); - expect(rows.sort((a, b) => (a.rate < b.rate))).toEqual(rows); + expect(rows.sort((a, b) => a.rate < b.rate)).toEqual(rows); }); it("should be ok with params", () => { @@ -136,7 +136,7 @@ describe("Delegate Repository", () => { const { count, rows } = repository.paginate({ offset: 10, limit: 10, orderBy: "rate:desc" }); expect(count).toBe(52); expect(rows).toHaveLength(10); - expect(rows.sort((a, b) => (a.rate > b.rate))).toEqual(rows); + expect(rows.sort((a, b) => a.rate > b.rate)).toEqual(rows); }); it("should be ok with params (no offset)", () => { diff --git a/packages/core-database/__tests__/wallet-manager.test.ts b/packages/core-database/__tests__/wallet-manager.test.ts index 10fdd72bf6..41eb785193 100644 --- a/packages/core-database/__tests__/wallet-manager.test.ts +++ b/packages/core-database/__tests__/wallet-manager.test.ts @@ -6,7 +6,7 @@ import wallets from "./__fixtures__/wallets.json"; import { setUp, tearDown } from "./__support__/setup"; const { Block, Transaction, Wallet } = models; -const { ARKTOSHI, TRANSACTION_TYPES } = constants; +const { ARKTOSHI, TransactionTypes } = constants; const { generateDelegateRegistration, generateSecondSignature, generateTransfers, generateVote } = generators; @@ -235,7 +235,7 @@ describe("Wallet Manager", () => { describe("revertTransaction", () => { it("should revert the transaction from the sender & recipient", async () => { const transaction = new Transaction({ - type: TRANSACTION_TYPES.TRANSFER, + type: TransactionTypes.Transfer, amount: 245098000000000, fee: 0, recipientId: "AHXtmB84sTZ9Zd35h9Y1vfFvPE2Xzqj8ri", diff --git a/packages/core-database/src/interface.ts b/packages/core-database/src/interface.ts index 1d753e9a78..4e0e416e8a 100644 --- a/packages/core-database/src/interface.ts +++ b/packages/core-database/src/interface.ts @@ -10,7 +10,7 @@ import { DelegatesRepository } from "./repositories/delegates"; import { WalletsRepository } from "./repositories/wallets"; const { Block } = models; -const { TRANSACTION_TYPES } = constants; +const { TransactionTypes } = constants; export abstract class ConnectionInterface { public config: any; @@ -32,7 +32,7 @@ export abstract class ConnectionInterface { * @param {Object} options */ public constructor(public readonly options) { - this.config = app.resolvePlugin("config"); + this.config = app.getConfig(); this.logger = app.resolvePlugin("logger"); this.emitter = app.resolvePlugin("event-emitter"); @@ -277,7 +277,7 @@ export abstract class ConnectionInterface { */ public async applyRound(height) { const nextHeight = height === 1 ? 1 : height + 1; - const maxDelegates = this.config.getConstants(nextHeight).activeDelegates; + const maxDelegates = this.config.getMilestone(nextHeight).activeDelegates; if (nextHeight % maxDelegates === 1) { const round = Math.floor((nextHeight - 1) / maxDelegates) + 1; @@ -453,7 +453,7 @@ export abstract class ConnectionInterface { * @return {Boolean} */ public async verifyTransaction(transaction) { - const senderId = crypto.getAddress(transaction.data.senderPublicKey, this.config.network.pubKeyHash); + const senderId = crypto.getAddress(transaction.data.senderPublicKey, this.config.get("network.pubKeyHash")); const sender = this.walletManager.findByAddress(senderId); // should exist @@ -489,7 +489,7 @@ export abstract class ConnectionInterface { round = roundCalculator.calculateRound(height).round; } - const maxDelegates = this.config.getConstants(height).activeDelegates; + const maxDelegates = this.config.getMilestone(height).activeDelegates; height = round * maxDelegates + 1; const blocks = await this.getBlocks(height - maxDelegates, maxDelegates - 1); @@ -533,11 +533,11 @@ export abstract class ConnectionInterface { return false; } - if (!Array.isArray(this.config.network.exceptions.blocks)) { + if (!Array.isArray(this.config.get("exceptions.blocks"))) { return false; } - return this.config.network.exceptions.blocks.includes(block.id); + return this.config.get("exceptions.blocks").includes(block.id); } /** @@ -548,15 +548,15 @@ export abstract class ConnectionInterface { private __emitTransactionEvents(transaction) { this.emitter.emit("transaction.applied", transaction.data); - if (transaction.type === TRANSACTION_TYPES.DELEGATE_REGISTRATION) { + if (transaction.type === TransactionTypes.DelegateRegistration) { this.emitter.emit("delegate.registered", transaction.data); } - if (transaction.type === TRANSACTION_TYPES.DELEGATE_RESIGNATION) { + if (transaction.type === TransactionTypes.DelegateResignation) { this.emitter.emit("delegate.resigned", transaction.data); } - if (transaction.type === TRANSACTION_TYPES.VOTE) { + if (transaction.type === TransactionTypes.Vote) { const vote = transaction.asset.votes[0]; this.emitter.emit(vote.startsWith("+") ? "wallet.vote" : "wallet.unvote", { diff --git a/packages/core-database/src/wallet-manager.ts b/packages/core-database/src/wallet-manager.ts index 5178ac1f76..ee909eb553 100644 --- a/packages/core-database/src/wallet-manager.ts +++ b/packages/core-database/src/wallet-manager.ts @@ -4,7 +4,7 @@ import { constants, crypto, formatArktoshi, models } from "@arkecosystem/crypto" import pluralize from "pluralize"; const { Wallet } = models; -const { TRANSACTION_TYPES } = constants; +const { TransactionTypes } = constants; export class WalletManager { public logger: any; @@ -20,10 +20,10 @@ export class WalletManager { * @constructor */ constructor() { - this.config = app.resolvePlugin("config"); + this.config = app.getConfig(); this.logger = app.resolvePlugin("logger"); - this.networkId = this.config ? this.config.network.pubKeyHash : 0x17; + this.networkId = this.config ? this.config.get("network.pubKeyHash") : 0x17; this.reset(); } @@ -411,10 +411,7 @@ export class WalletManager { const errors = []; // specific verifications / adjustments depending on transaction type - if ( - type === TRANSACTION_TYPES.DELEGATE_REGISTRATION && - this.byUsername[asset.delegate.username.toLowerCase()] - ) { + if (type === TransactionTypes.DelegateRegistration && this.byUsername[asset.delegate.username.toLowerCase()]) { this.logger.error( `Can't apply transaction ${ data.id @@ -424,10 +421,10 @@ export class WalletManager { // NOTE: We use the vote public key, because vote transactions // have the same sender and recipient - } else if (type === TRANSACTION_TYPES.VOTE && !this.__isDelegate(asset.votes[0].slice(1))) { + } else if (type === TransactionTypes.Vote && !this.__isDelegate(asset.votes[0].slice(1))) { this.logger.error(`Can't apply vote transaction ${data.id}: delegate ${asset.votes[0]} does not exist.`); throw new Error(`Can't apply transaction ${data.id}: delegate ${asset.votes[0]} does not exist.`); - } else if (type === TRANSACTION_TYPES.SECOND_SIGNATURE) { + } else if (type === TransactionTypes.SecondSignature) { data.recipientId = ""; } @@ -444,11 +441,11 @@ export class WalletManager { sender.applyTransactionToSender(data); - if (type === TRANSACTION_TYPES.DELEGATE_REGISTRATION) { + if (type === TransactionTypes.DelegateRegistration) { this.reindex(sender); } - if (recipient && type === TRANSACTION_TYPES.TRANSFER) { + if (recipient && type === TransactionTypes.Transfer) { recipient.applyTransactionToRecipient(data); } @@ -475,7 +472,7 @@ export class WalletManager { */ public _updateVoteBalances(sender, recipient, transaction, revert = false) { // TODO: multipayment? - if (transaction.type !== TRANSACTION_TYPES.VOTE) { + if (transaction.type !== TransactionTypes.Vote) { // Update vote balance of the sender's delegate if (sender.vote) { const delegate = this.findByPublicKey(sender.vote); @@ -519,11 +516,11 @@ export class WalletManager { sender.revertTransactionForSender(data); // removing the wallet from the delegates index - if (type === TRANSACTION_TYPES.DELEGATE_REGISTRATION) { + if (type === TransactionTypes.DelegateRegistration) { delete this.byUsername[data.asset.delegate.username]; } - if (recipient && type === TRANSACTION_TYPES.TRANSFER) { + if (recipient && type === TransactionTypes.Transfer) { recipient.revertTransactionForRecipient(data); } @@ -566,10 +563,12 @@ export class WalletManager { return false; } - if (!Array.isArray(this.config.network.exceptions.transactions)) { + const exceptions: any = this.config.get("exceptions.transactions"); + + if (!Array.isArray(exceptions)) { return false; } - return this.config.network.exceptions.transactions.includes(transaction.id); + return exceptions.includes(transaction.id); } } diff --git a/packages/core-deployer/__tests__/builder/genesis-block.test.ts b/packages/core-deployer/__tests__/builder/genesis-block.test.ts index 911c532d66..308793ee80 100644 --- a/packages/core-deployer/__tests__/builder/genesis-block.test.ts +++ b/packages/core-deployer/__tests__/builder/genesis-block.test.ts @@ -1,5 +1,5 @@ import "jest-extended"; -import network from "../../../crypto/src/networks/ark/testnet.json"; +import { testnet } from "../../../crypto/src/networks"; import { GenesisBlockBuilder } from "../../src/builder/genesis-block"; let builder; @@ -9,7 +9,7 @@ let delegateWallet; let delegateWallets; beforeEach(() => { - builder = new GenesisBlockBuilder(network, { + builder = new GenesisBlockBuilder(testnet.network, { totalPremine: 2100000000000000, activeDelegates: 2, }); diff --git a/packages/core-deployer/src/index.ts b/packages/core-deployer/src/index.ts index 96f609a9af..892f7b25cb 100644 --- a/packages/core-deployer/src/index.ts +++ b/packages/core-deployer/src/index.ts @@ -82,7 +82,7 @@ if (fs.existsSync(options.configPath)) { } fs.ensureDirSync(options.configPath); fs.copySync(path.resolve(__dirname, `../../core/src/config/${options.network}`), options.configPath); -const networkPath = path.resolve(__dirname, `../../crypto/src/networks/ark/${options.network}.json`); +const networkPath = path.resolve(__dirname, `../../crypto/src/networks/${options.network}.json`); if (!fs.existsSync(networkPath)) { logger.error(`Network '${options.network}' does not exist`); process.exit(1); @@ -106,22 +106,6 @@ const networkConfig = { epoch: options.epoch, activeDelegates: options.activeDelegates, fees: { - dynamic: false, - dynamicFees: { - minFeePool: 1000, - minFeeBroadcast: 1000, - addonBytes: { - transfer: 100, - secondSignature: 250, - delegateRegistration: 500, - vote: 100, - multiSignature: 500, - ipfs: 250, - timelockTransfer: 500, - multiPayment: 500, - delegateResignation: 500, - }, - }, staticFees: { transfer: options.feeTransfer, secondSignature: options.feeVote, diff --git a/packages/core-forger/__tests__/manager.test.ts b/packages/core-forger/__tests__/manager.test.ts index 5e757ec343..fb4a59f585 100644 --- a/packages/core-forger/__tests__/manager.test.ts +++ b/packages/core-forger/__tests__/manager.test.ts @@ -2,7 +2,7 @@ import { generators } from "@arkecosystem/core-test-utils"; import "jest-extended"; import { Bignum, models } from "@arkecosystem/crypto"; -import { testnet } from "../../crypto/src/networks/ark"; +import { testnet } from "../../crypto/src/networks"; import { defaults } from "../src/defaults"; import { ForgerManager } from "../src/manager"; import { sampleBlock } from "./__fixtures__/block"; diff --git a/packages/core-forger/src/client.ts b/packages/core-forger/src/client.ts index ad02267bb5..f0ebdf6109 100644 --- a/packages/core-forger/src/client.ts +++ b/packages/core-forger/src/client.ts @@ -27,7 +27,7 @@ export class Client { this.headers = { version: app.getVersion(), port, - nethash: app.resolvePlugin("config").network.nethash, + nethash: app.getConfig().get("network.nethash"), "x-auth": "forger", "Content-Type": "application/json", }; diff --git a/packages/core-forger/src/manager.ts b/packages/core-forger/src/manager.ts index d320778739..8cea66dc5f 100644 --- a/packages/core-forger/src/manager.ts +++ b/packages/core-forger/src/manager.ts @@ -26,10 +26,10 @@ export class ForgerManager { */ constructor(options) { this.logger = app.resolvePlugin("logger"); - this.config = app.resolvePlugin("config"); + this.config = app.getConfig(); - this.secrets = this.config.delegates ? this.config.delegates.secrets : null; - this.network = this.config.network; + this.secrets = this.config.get("delegates.secrets"); + this.network = this.config.get("network"); this.client = new Client(options.hosts); } @@ -101,7 +101,7 @@ export class ForgerManager { await this.__loadUsernames(); round = await this.client.getRound(); - const delayTime = +this.config.getConstants(round.lastBlock.height).blocktime * 1000 - 2000; + const delayTime = +this.config.getMilestone(round.lastBlock.height).blocktime * 1000 - 2000; if (!round.canForge) { // this.logger.debug('Block already forged in current slot') diff --git a/packages/core-graphql/src/repositories/transactions.ts b/packages/core-graphql/src/repositories/transactions.ts index d2099dd03d..e98d10013f 100644 --- a/packages/core-graphql/src/repositories/transactions.ts +++ b/packages/core-graphql/src/repositories/transactions.ts @@ -6,7 +6,7 @@ import dayjs from "dayjs-ext"; import { Repository } from "./repository"; import { buildFilterQuery } from "./utils/filter-query"; -const { TRANSACTION_TYPES } = constants; +const { TransactionTypes } = constants; const database = app.resolvePlugin("database"); class TransactionsRepository extends Repository { @@ -30,7 +30,7 @@ class TransactionsRepository extends Repository { } if (parameters.type) { - parameters.type = TRANSACTION_TYPES[parameters.type]; + parameters.type = TransactionTypes[parameters.type]; } const applyConditions = queries => { @@ -163,7 +163,7 @@ class TransactionsRepository extends Repository { */ public async allVotesBySender(senderPublicKey, parameters = {}) { return this.findAll({ - ...{ senderPublicKey, type: TRANSACTION_TYPES.VOTE }, + ...{ senderPublicKey, type: TransactionTypes.Vote }, ...parameters, }); } diff --git a/packages/core-json-rpc/src/server/services/network.ts b/packages/core-json-rpc/src/server/services/network.ts index d9acae8af1..bf3dba3ac4 100644 --- a/packages/core-json-rpc/src/server/services/network.ts +++ b/packages/core-json-rpc/src/server/services/network.ts @@ -15,15 +15,13 @@ class Network { public async init() { this.logger = app.resolvePlugin("logger"); - this.config = app.resolvePlugin("config"); + this.config = app.getConfig(); this.p2p = app.resolvePlugin("p2p"); - this.network = this.config.network; + this.network = configManager.all(); this.__loadRemotePeers(); - configManager.setConfig(this.config.network); - this.client = axios.create({ headers: { Accept: "application/vnd.ark.core-api.v2+json", diff --git a/packages/core-p2p/src/court/guard.ts b/packages/core-p2p/src/court/guard.ts index c3d4205c85..eef2c29456 100644 --- a/packages/core-p2p/src/court/guard.ts +++ b/packages/core-p2p/src/court/guard.ts @@ -9,7 +9,7 @@ import { config as localConfig } from "../config"; import * as utils from "../utils"; import { offences } from "./offences"; -const config = app.resolvePlugin("config"); +const config = app.getConfig(); const logger = app.resolvePlugin("logger"); interface ISuspension { @@ -188,7 +188,7 @@ class Guard { */ public isValidNetwork(peer) { const nethash = peer.nethash || (peer.headers && peer.headers.nethash); - return nethash === config.network.nethash; + return nethash === config.get("network.nethash"); } /** diff --git a/packages/core-p2p/src/monitor.ts b/packages/core-p2p/src/monitor.ts index ab2a44fea6..28fe31f2c3 100755 --- a/packages/core-p2p/src/monitor.ts +++ b/packages/core-p2p/src/monitor.ts @@ -21,7 +21,7 @@ import networkState from "./utils/network-state"; import checkDNS from "./utils/check-dns"; import checkNTP from "./utils/check-ntp"; -const config = app.resolvePlugin("config"); +const config = app.getConfig(); const logger = app.resolvePlugin("logger"); const emitter = app.resolvePlugin("event-emitter"); @@ -73,7 +73,7 @@ class Monitor { logger.info(`Discovered ${pluralize("peer", peers.length, true)} with v${version}.`); } - if (config.network.name !== "mainnet") { + if (config.get("network.name") !== "mainnet") { for (const [hashid, peers] of Object.entries(groupBy(this.peers, "hashid"))) { logger.info(`Discovered ${pluralize("peer", peers.length, true)} on commit ${hashid}.`); } @@ -821,17 +821,19 @@ class Monitor { * @return {void} */ private populateSeedPeers() { - if (!config.peers.list) { + const peerList = config.get("peers.list"); + + if (!peerList) { app.forceExit("No seed peers defined in peers.json :interrobang:"); } - let peers = config.peers.list.map(peer => { + let peers = peerList.map(peer => { peer.version = app.getVersion(); return peer; }); - if (config.peers_backup) { - peers = { ...peers, ...config.peers_backup }; + if (config.get("peers_backup")) { + peers = { ...peers, ...config.get("peers_backup") }; } const filteredPeers: any[] = Object.values(peers).filter( diff --git a/packages/core-p2p/src/peer.ts b/packages/core-p2p/src/peer.ts index e5d829c8ad..61b155e7a7 100755 --- a/packages/core-p2p/src/peer.ts +++ b/packages/core-p2p/src/peer.ts @@ -42,7 +42,7 @@ export class Peer { */ constructor(readonly ip, readonly port) { this.logger = app.resolvePlugin("logger"); - this.config = app.resolvePlugin("config"); + this.config = app.getConfig(); this.ban = new Date().getTime(); this.url = `${port % 443 === 0 ? "https://" : "http://"}${ip}:${port}`; @@ -53,12 +53,12 @@ export class Peer { this.headers = { version: app.getVersion(), port: localConfig.get("port"), - nethash: this.config.network.nethash, + nethash: this.config.get("network.nethash"), height: null, "Content-Type": "application/json", }; - if (this.config.network.name !== "mainnet") { + if (this.config.get("network.name") !== "mainnet") { this.headers.hashid = app.getHashid(); } } @@ -99,7 +99,7 @@ export class Peer { delay: this.delay, }; - if (this.config.network.name !== "mainnet") { + if (this.config.get("network.name") !== "mainnet") { (data as any).hashid = this.hashid || "unknown"; } @@ -274,7 +274,7 @@ export class Peer { try { const response = await axios.get(`${this.url}${endpoint}`, { headers: this.headers, - timeout: timeout || this.config.peers.globalTimeout, + timeout: timeout || this.config.get("peers.globalTimeout"), }); this.delay = new Date().getTime() - temp; diff --git a/packages/core-p2p/src/server/plugins/set-headers.ts b/packages/core-p2p/src/server/plugins/set-headers.ts index b6701be1bb..9265676a24 100644 --- a/packages/core-p2p/src/server/plugins/set-headers.ts +++ b/packages/core-p2p/src/server/plugins/set-headers.ts @@ -1,7 +1,7 @@ import { app } from "@arkecosystem/core-container"; import { config as localConfig } from "../../config"; -const config = app.resolvePlugin("config"); +const config = app.getConfig(); /** * The register method used by hapi.js. @@ -11,7 +11,7 @@ const config = app.resolvePlugin("config"); */ const register = async (server, options) => { const headers = { - nethash: config.network.nethash, + nethash: config.get("network.nethash"), version: app.getVersion(), port: localConfig.get("port"), os: require("os").platform(), @@ -20,7 +20,7 @@ const register = async (server, options) => { const requiredHeaders = ["nethash", "version", "port", "os", "height"]; - if (config.network.name !== "mainnet") { + if (config.get("network.name") !== "mainnet") { (headers as any).hashid = app.getHashid(); requiredHeaders.push("hashid"); } diff --git a/packages/core-p2p/src/server/versions/1/handlers.ts b/packages/core-p2p/src/server/versions/1/handlers.ts index f7187b7a76..e8b2ce426d 100644 --- a/packages/core-p2p/src/server/versions/1/handlers.ts +++ b/packages/core-p2p/src/server/versions/1/handlers.ts @@ -8,7 +8,7 @@ import { monitor } from "../../../monitor"; const { Block, Transaction } = models; const transactionPool = app.resolvePlugin("transactionPool"); -const config = app.resolvePlugin("config"); +const config = app.getConfig(); const logger = app.resolvePlugin("logger"); /** @@ -112,7 +112,7 @@ export const getTransactionsFromIds = { async handler(request, h) { try { const blockchain = app.resolvePlugin("blockchain"); - const maxTransactions = config.getConstants(blockchain.getLastHeight()).block.maxTransactions; + const maxTransactions = config.getMilestone(blockchain.getLastHeight()).block.maxTransactions; const transactionIds = request.query.ids .split(",") diff --git a/packages/core-p2p/src/server/versions/config/handlers/index.ts b/packages/core-p2p/src/server/versions/config/handlers/index.ts index 0ba4c379fc..3a04fbbeec 100644 --- a/packages/core-p2p/src/server/versions/config/handlers/index.ts +++ b/packages/core-p2p/src/server/versions/config/handlers/index.ts @@ -1,7 +1,7 @@ import { app } from "@arkecosystem/core-container"; import { transformPlugins } from "../transformers/plugins"; -const appConfig = app.resolvePlugin("config"); +const appConfig = app.getConfig(); export const config = { async handler(request, h) { @@ -9,12 +9,13 @@ export const config = { data: { version: app.getVersion(), network: { - version: appConfig.network.pubKeyHash, - nethash: appConfig.network.nethash, - explorer: appConfig.network.client.explorer, + version: appConfig.get("network.pubKeyHash"), + name: appConfig.get("network.name"), + nethash: appConfig.get("network.nethash"), + explorer: appConfig.get("network.client.explorer"), token: { - name: appConfig.network.client.token, - symbol: appConfig.network.client.symbol, + name: appConfig.get("network.client.token"), + symbol: appConfig.get("network.client.symbol"), }, }, plugins: transformPlugins(appConfig), @@ -34,6 +35,22 @@ export const network = { }, }; +export const exceptions = { + handler(request, h) { + return { + data: require(`${process.env.ARK_PATH_CONFIG}/exceptions.json`), + }; + }, +}; + +export const milestones = { + handler(request, h) { + return { + data: require(`${process.env.ARK_PATH_CONFIG}/milestones.json`), + }; + }, +}; + export const genesisBlock = { handler(request, h) { return { diff --git a/packages/core-p2p/src/server/versions/config/index.ts b/packages/core-p2p/src/server/versions/config/index.ts index a3ea109446..ab7fc862a5 100644 --- a/packages/core-p2p/src/server/versions/config/index.ts +++ b/packages/core-p2p/src/server/versions/config/index.ts @@ -9,6 +9,8 @@ const register = async (server, options) => { server.route([ { method: "GET", path: "/", ...handlers.config }, { method: "GET", path: "/network", ...handlers.network }, + { method: "GET", path: "/exceptions", ...handlers.exceptions }, + { method: "GET", path: "/milestones", ...handlers.milestones }, { method: "GET", path: "/genesis-block", ...handlers.genesisBlock }, { method: "GET", path: "/peers", ...handlers.peers }, { method: "GET", path: "/delegates", ...handlers.delegates }, diff --git a/packages/core-p2p/src/server/versions/internal/handlers/rounds.ts b/packages/core-p2p/src/server/versions/internal/handlers/rounds.ts index ec5d0ba65a..ad055c9812 100644 --- a/packages/core-p2p/src/server/versions/internal/handlers/rounds.ts +++ b/packages/core-p2p/src/server/versions/internal/handlers/rounds.ts @@ -1,7 +1,7 @@ import { app } from "@arkecosystem/core-container"; import { slots } from "@arkecosystem/crypto"; -const config = app.resolvePlugin("config"); +const config = app.getConfig(); /** * @type {Object} @@ -19,9 +19,9 @@ export const current = { const lastBlock = blockchain.getLastBlock(); const height = lastBlock.data.height + 1; - const maxActive = config.getConstants(height).activeDelegates; - const blockTime = config.getConstants(height).blocktime; - const reward = config.getConstants(height).reward; + const maxActive = config.getMilestone(height).activeDelegates; + const blockTime = config.getMilestone(height).blocktime; + const reward = config.getMilestone(height).reward; const delegates = await database.getActiveDelegates(height); const timestamp = slots.getTime(); diff --git a/packages/core-p2p/src/server/versions/internal/handlers/transactions.ts b/packages/core-p2p/src/server/versions/internal/handlers/transactions.ts index 35dedec121..d72f925725 100644 --- a/packages/core-p2p/src/server/versions/internal/handlers/transactions.ts +++ b/packages/core-p2p/src/server/versions/internal/handlers/transactions.ts @@ -2,7 +2,7 @@ import { app } from "@arkecosystem/core-container"; import { models } from "@arkecosystem/crypto"; import * as schema from "../schemas/transactions"; -const config = app.resolvePlugin("config"); +const config = app.getConfig(); const { Transaction } = models; /** @@ -41,7 +41,7 @@ export const forging = { const blockchain = app.resolvePlugin("blockchain"); const height = blockchain.getLastBlock().data.height; - const maxTransactions = config.getConstants(height).block.maxTransactions; + const maxTransactions = config.getMilestone(height).block.maxTransactions; return { data: blockchain.getUnconfirmedTransactions(maxTransactions, true), diff --git a/packages/core-p2p/src/utils/network-state.ts b/packages/core-p2p/src/utils/network-state.ts index 53b88ce5e3..7c64db8561 100644 --- a/packages/core-p2p/src/utils/network-state.ts +++ b/packages/core-p2p/src/utils/network-state.ts @@ -4,7 +4,7 @@ import { app } from "@arkecosystem/core-container"; import { slots } from "@arkecosystem/crypto"; import { config as localConfig } from "../config"; -const config = app.resolvePlugin("config"); +const config = app.getConfig(); /** * Returns current network state. Peers are update before the call diff --git a/packages/core-snapshots-cli/src/utils/index.ts b/packages/core-snapshots-cli/src/utils/index.ts index 0e7def7e8c..c83a165bf0 100644 --- a/packages/core-snapshots-cli/src/utils/index.ts +++ b/packages/core-snapshots-cli/src/utils/index.ts @@ -4,7 +4,6 @@ export const setUpLite = async options => { process.env.ARK_SKIP_BLOCKCHAIN = "true"; await app.setUp("2.0.0", options, { include: [ - "@arkecosystem/core-config", "@arkecosystem/core-logger", "@arkecosystem/core-logger-winston", "@arkecosystem/core-event-emitter", diff --git a/packages/core-snapshots/src/db/index.ts b/packages/core-snapshots/src/db/index.ts index 29eea50e61..ad3db68604 100644 --- a/packages/core-snapshots/src/db/index.ts +++ b/packages/core-snapshots/src/db/index.ts @@ -67,8 +67,8 @@ class Database { } public async rollbackChain(height) { - const config = app.resolvePlugin("config"); - const maxDelegates = config.getConstants(height).activeDelegates; + const config = app.getConfig(); + const maxDelegates = config.getMilestone(height).activeDelegates; const currentRound = Math.floor(height / maxDelegates); const lastBlockHeight = currentRound * maxDelegates; const lastRemainingBlock = await this.getBlockByHeight(lastBlockHeight); diff --git a/packages/core-snapshots/src/manager.ts b/packages/core-snapshots/src/manager.ts index 27071f53e3..c631ee5bdf 100644 --- a/packages/core-snapshots/src/manager.ts +++ b/packages/core-snapshots/src/manager.ts @@ -79,8 +79,8 @@ export class SnapshotManager { public async rollbackChain(height) { const lastBlock = await this.database.getLastBlock(); - const config = app.resolvePlugin("config"); - const maxDelegates = config.getConstants(lastBlock.height).activeDelegates; + const config = app.getConfig(); + const maxDelegates = config.getMilestone(lastBlock.height).activeDelegates; const rollBackHeight = height === -1 ? lastBlock.height : height; if (rollBackHeight >= lastBlock.height || rollBackHeight < 1) { diff --git a/packages/core-test-utils/__tests__/generators/transactions.test.ts b/packages/core-test-utils/__tests__/generators/transactions.test.ts index 4d42c4e8f9..bfec0f01dd 100644 --- a/packages/core-test-utils/__tests__/generators/transactions.test.ts +++ b/packages/core-test-utils/__tests__/generators/transactions.test.ts @@ -1,12 +1,12 @@ import { constants } from "../../../crypto"; import { generateTransaction } from "../../src/generators"; -const { TRANSACTION_TYPES } = constants; +const { TransactionTypes } = constants; describe("generateTransactions", () => { it("should create transfer transactions for devnet", () => { const devnetAddress = "DJQL8LWj81nRJNv9bbUgNXXELcB3q5qjZH"; - const transactions = generateTransaction("devnet", TRANSACTION_TYPES.TRANSFER, undefined, devnetAddress); + const transactions = generateTransaction("devnet", TransactionTypes.Transfer, undefined, devnetAddress); for (const transaction of transactions) { expect(transaction).toMatchObject({ recipientId: devnetAddress }); diff --git a/packages/core-test-utils/__tests__/generators/transactions/delegate.test.ts b/packages/core-test-utils/__tests__/generators/transactions/delegate.test.ts index 5f79d57a96..6ddb90a61c 100644 --- a/packages/core-test-utils/__tests__/generators/transactions/delegate.test.ts +++ b/packages/core-test-utils/__tests__/generators/transactions/delegate.test.ts @@ -1,7 +1,7 @@ import { constants } from "../../../../crypto"; import { generateDelegateRegistration } from "../../../src/generators"; -const { TRANSACTION_TYPES } = constants; +const { TransactionTypes } = constants; describe("Delegate transaction", () => { const quantity = 4; @@ -14,7 +14,7 @@ describe("Delegate transaction", () => { it("should return an array of 4 delegate objects", () => { for (const transaction of transactions) { expect(transaction).toMatchObject({ - type: TRANSACTION_TYPES.DELEGATE_REGISTRATION, + type: TransactionTypes.DelegateRegistration, }); } }); diff --git a/packages/core-test-utils/__tests__/generators/transactions/signature.test.ts b/packages/core-test-utils/__tests__/generators/transactions/signature.test.ts index ba24054eaa..87ae6c2e7b 100644 --- a/packages/core-test-utils/__tests__/generators/transactions/signature.test.ts +++ b/packages/core-test-utils/__tests__/generators/transactions/signature.test.ts @@ -1,7 +1,7 @@ import { constants } from "../../../../crypto"; import { generateSecondSignature } from "../../../src/generators"; -const { TRANSACTION_TYPES } = constants; +const { TransactionTypes } = constants; describe("Signature transaction", () => { const quantity = 4; @@ -14,7 +14,7 @@ describe("Signature transaction", () => { it("should return an array of 4 signature objects", () => { for (const transaction of transactions) { expect(transaction).toMatchObject({ - type: TRANSACTION_TYPES.SECOND_SIGNATURE, + type: TransactionTypes.SecondSignature, }); } }); diff --git a/packages/core-test-utils/__tests__/generators/transactions/transfer.test.ts b/packages/core-test-utils/__tests__/generators/transactions/transfer.test.ts index db1c1734b8..d5b72d7a83 100644 --- a/packages/core-test-utils/__tests__/generators/transactions/transfer.test.ts +++ b/packages/core-test-utils/__tests__/generators/transactions/transfer.test.ts @@ -1,7 +1,7 @@ import { Bignum, constants } from "../../../../crypto"; import { generateTransfers } from "../../../src/generators"; -const { TRANSACTION_TYPES, ARKTOSHI } = constants; +const { TransactionTypes, ARKTOSHI } = constants; describe("Transfer transaction", () => { const amount = new (Bignum as any)(20 * ARKTOSHI); @@ -15,7 +15,7 @@ describe("Transfer transaction", () => { it("should return an array of 4 transfer objects", () => { for (const transaction of transactions) { expect(transaction).toMatchObject({ - type: TRANSACTION_TYPES.TRANSFER, + type: TransactionTypes.Transfer, }); } }); diff --git a/packages/core-test-utils/__tests__/generators/transactions/vote.test.ts b/packages/core-test-utils/__tests__/generators/transactions/vote.test.ts index dc4b685de8..6f6f59949f 100644 --- a/packages/core-test-utils/__tests__/generators/transactions/vote.test.ts +++ b/packages/core-test-utils/__tests__/generators/transactions/vote.test.ts @@ -1,7 +1,7 @@ import { constants } from "../../../../crypto"; import { generateVote } from "../../../src/generators"; -const { TRANSACTION_TYPES } = constants; +const { TransactionTypes } = constants; describe("Vote transaction", () => { const quantity = 4; @@ -13,7 +13,7 @@ describe("Vote transaction", () => { it("should return an array of 4 vote objects", () => { for (const transaction of transactions) { - expect(transaction).toMatchObject({ type: TRANSACTION_TYPES.VOTE }); + expect(transaction).toMatchObject({ type: TransactionTypes.Vote }); } }); }); diff --git a/packages/core-test-utils/__tests__/matchers/transactions/types/delegate-resignation.test.ts b/packages/core-test-utils/__tests__/matchers/transactions/types/delegate-resignation.test.ts index 044991c8e3..84c0c3d2b1 100644 --- a/packages/core-test-utils/__tests__/matchers/transactions/types/delegate-resignation.test.ts +++ b/packages/core-test-utils/__tests__/matchers/transactions/types/delegate-resignation.test.ts @@ -1,12 +1,12 @@ import "../../../../src/matchers/transactions/types/delegate-resignation"; import { constants } from "@arkecosystem/crypto"; -const { TRANSACTION_TYPES } = constants; +const { TransactionTypes } = constants; describe(".toBeDelegateResignationType", () => { test("passes when given a valid transaction", () => { expect({ - type: TRANSACTION_TYPES.DELEGATE_RESIGNATION, + type: TransactionTypes.DelegateResignation, }).toBeDelegateResignationType(); }); diff --git a/packages/core-test-utils/__tests__/matchers/transactions/types/delegate.test.ts b/packages/core-test-utils/__tests__/matchers/transactions/types/delegate.test.ts index 8b68419e63..fb9b2a284c 100644 --- a/packages/core-test-utils/__tests__/matchers/transactions/types/delegate.test.ts +++ b/packages/core-test-utils/__tests__/matchers/transactions/types/delegate.test.ts @@ -1,12 +1,12 @@ import "../../../../src/matchers/transactions/types/delegate"; import { constants } from "@arkecosystem/crypto"; -const { TRANSACTION_TYPES } = constants; +const { TransactionTypes } = constants; describe(".toBeDelegateType", () => { test("passes when given a valid transaction", () => { expect({ - type: TRANSACTION_TYPES.DELEGATE_REGISTRATION, + type: TransactionTypes.DelegateRegistration, }).toBeDelegateType(); }); diff --git a/packages/core-test-utils/__tests__/matchers/transactions/types/ipfs.test.ts b/packages/core-test-utils/__tests__/matchers/transactions/types/ipfs.test.ts index a036a9ee53..7400a8a338 100644 --- a/packages/core-test-utils/__tests__/matchers/transactions/types/ipfs.test.ts +++ b/packages/core-test-utils/__tests__/matchers/transactions/types/ipfs.test.ts @@ -1,11 +1,11 @@ import "../../../../src/matchers/transactions/types/ipfs"; import { constants } from "@arkecosystem/crypto"; -const { TRANSACTION_TYPES } = constants; +const { TransactionTypes } = constants; describe(".toBeIpfsType", () => { test("passes when given a valid transaction", () => { - expect({ type: TRANSACTION_TYPES.IPFS }).toBeIpfsType(); + expect({ type: TransactionTypes.Ipfs }).toBeIpfsType(); }); test("fails when given an invalid transaction", () => { diff --git a/packages/core-test-utils/__tests__/matchers/transactions/types/multi-payment.test.ts b/packages/core-test-utils/__tests__/matchers/transactions/types/multi-payment.test.ts index 47ca786c78..98879eb1df 100644 --- a/packages/core-test-utils/__tests__/matchers/transactions/types/multi-payment.test.ts +++ b/packages/core-test-utils/__tests__/matchers/transactions/types/multi-payment.test.ts @@ -1,11 +1,11 @@ import "../../../../src/matchers/transactions/types/multi-payment"; import { constants } from "@arkecosystem/crypto"; -const { TRANSACTION_TYPES } = constants; +const { TransactionTypes } = constants; describe(".toBeMultiPaymentType", () => { test("passes when given a valid transaction", () => { - expect({ type: TRANSACTION_TYPES.MULTI_PAYMENT }).toBeMultiPaymentType(); + expect({ type: TransactionTypes.MultiPayment }).toBeMultiPaymentType(); }); test("fails when given an invalid transaction", () => { diff --git a/packages/core-test-utils/__tests__/matchers/transactions/types/multi-signature.test.ts b/packages/core-test-utils/__tests__/matchers/transactions/types/multi-signature.test.ts index 2b696d7bfc..2fba298638 100644 --- a/packages/core-test-utils/__tests__/matchers/transactions/types/multi-signature.test.ts +++ b/packages/core-test-utils/__tests__/matchers/transactions/types/multi-signature.test.ts @@ -1,12 +1,12 @@ import "../../../../src/matchers/transactions/types/multi-signature"; import { constants } from "@arkecosystem/crypto"; -const { TRANSACTION_TYPES } = constants; +const { TransactionTypes } = constants; describe(".toBeMultiSignatureType", () => { test("passes when given a valid transaction", () => { expect({ - type: TRANSACTION_TYPES.MULTI_SIGNATURE, + type: TransactionTypes.MultiSignature, }).toBeMultiSignatureType(); }); diff --git a/packages/core-test-utils/__tests__/matchers/transactions/types/second-signature.test.ts b/packages/core-test-utils/__tests__/matchers/transactions/types/second-signature.test.ts index 2ca7c9184c..29f1b03b03 100644 --- a/packages/core-test-utils/__tests__/matchers/transactions/types/second-signature.test.ts +++ b/packages/core-test-utils/__tests__/matchers/transactions/types/second-signature.test.ts @@ -1,12 +1,12 @@ import "../../../../src/matchers/transactions/types/second-signature"; import { constants } from "@arkecosystem/crypto"; -const { TRANSACTION_TYPES } = constants; +const { TransactionTypes } = constants; describe(".toBeSecondSignatureType", () => { test("passes when given a valid transaction", () => { expect({ - type: TRANSACTION_TYPES.SECOND_SIGNATURE, + type: TransactionTypes.SecondSignature, }).toBeSecondSignatureType(); }); diff --git a/packages/core-test-utils/__tests__/matchers/transactions/types/timelock-transfer.test.ts b/packages/core-test-utils/__tests__/matchers/transactions/types/timelock-transfer.test.ts index f8d9b6b617..408a26dfd7 100644 --- a/packages/core-test-utils/__tests__/matchers/transactions/types/timelock-transfer.test.ts +++ b/packages/core-test-utils/__tests__/matchers/transactions/types/timelock-transfer.test.ts @@ -1,12 +1,12 @@ import "../../../../src/matchers/transactions/types/timelock-transfer"; import { constants } from "@arkecosystem/crypto"; -const { TRANSACTION_TYPES } = constants; +const { TransactionTypes } = constants; describe(".toBeTimelockTransferType", () => { test("passes when given a valid transaction", () => { expect({ - type: TRANSACTION_TYPES.TIMELOCK_TRANSFER, + type: TransactionTypes.TimelockTransfer, }).toBeTimelockTransferType(); }); diff --git a/packages/core-test-utils/__tests__/matchers/transactions/types/transfer.test.ts b/packages/core-test-utils/__tests__/matchers/transactions/types/transfer.test.ts index e26e16d7a8..fb93db084d 100644 --- a/packages/core-test-utils/__tests__/matchers/transactions/types/transfer.test.ts +++ b/packages/core-test-utils/__tests__/matchers/transactions/types/transfer.test.ts @@ -1,11 +1,11 @@ import "../../../../src/matchers/transactions/types/transfer"; import { constants } from "@arkecosystem/crypto"; -const { TRANSACTION_TYPES } = constants; +const { TransactionTypes } = constants; describe(".toBeTransferType", () => { test("passes when given a valid transaction", () => { - expect({ type: TRANSACTION_TYPES.TRANSFER }).toBeTransferType(); + expect({ type: TransactionTypes.Transfer }).toBeTransferType(); }); test("fails when given an invalid transaction", () => { diff --git a/packages/core-test-utils/__tests__/matchers/transactions/types/vote.test.ts b/packages/core-test-utils/__tests__/matchers/transactions/types/vote.test.ts index bd7a7dafb5..4f5e4e7050 100644 --- a/packages/core-test-utils/__tests__/matchers/transactions/types/vote.test.ts +++ b/packages/core-test-utils/__tests__/matchers/transactions/types/vote.test.ts @@ -1,11 +1,11 @@ import "../../../../src/matchers/transactions/types/vote"; import { constants } from "@arkecosystem/crypto"; -const { TRANSACTION_TYPES } = constants; +const { TransactionTypes } = constants; describe(".toBeVoteType", () => { test("passes when given a valid transaction", () => { - expect({ type: TRANSACTION_TYPES.VOTE }).toBeVoteType(); + expect({ type: TransactionTypes.Vote }).toBeVoteType(); }); test("fails when given an invalid transaction", () => { diff --git a/packages/core-test-utils/src/config/testnet/plugins.js b/packages/core-test-utils/src/config/testnet/plugins.js index 317d04d7e3..2d0d3cd85f 100644 --- a/packages/core-test-utils/src/config/testnet/plugins.js +++ b/packages/core-test-utils/src/config/testnet/plugins.js @@ -1,6 +1,5 @@ module.exports = { "@arkecosystem/core-event-emitter": {}, - "@arkecosystem/core-config": {}, "@arkecosystem/core-logger-winston": { transports: { console: { @@ -31,6 +30,10 @@ module.exports = { // 100+ years in the future to avoid our hardcoded transactions used in the // tests to expire immediately maxTransactionAge: 4036608000, + dynamicFees: { + minFeePool: 1000, + minFeeBroadcast: 1000 + } }, "@arkecosystem/core-p2p": { host: process.env.ARK_P2P_HOST || "0.0.0.0", diff --git a/packages/core-test-utils/src/fixtures/testnet/delegates.ts b/packages/core-test-utils/src/fixtures/testnet/delegates.ts index d0d02d139b..7f994bcf30 100644 --- a/packages/core-test-utils/src/fixtures/testnet/delegates.ts +++ b/packages/core-test-utils/src/fixtures/testnet/delegates.ts @@ -5,7 +5,7 @@ import { client, crypto } from "@arkecosystem/crypto"; * @return {Array} array of objects like { secret, publicKey, address, balance } */ -client.getConfigManager().setFromPreset("ark", "testnet"); +client.getConfigManager().setFromPreset("testnet"); import { secrets } from "../../config/testnet/delegates.json"; import { transactions as genesisTransactions } from "../../config/testnet/genesisBlock.json"; diff --git a/packages/core-test-utils/src/generators/transactions/delegate.ts b/packages/core-test-utils/src/generators/transactions/delegate.ts index 9435c4ce5c..d8dc4a5944 100644 --- a/packages/core-test-utils/src/generators/transactions/delegate.ts +++ b/packages/core-test-utils/src/generators/transactions/delegate.ts @@ -1,7 +1,7 @@ import { constants } from "@arkecosystem/crypto"; import { generateTransaction } from "./transaction"; -const { DELEGATE_REGISTRATION } = constants.TRANSACTION_TYPES; +const { DelegateRegistration } = constants.TransactionTypes; export const generateDelegateRegistration = ( network, @@ -9,4 +9,4 @@ export const generateDelegateRegistration = ( quantity: number = 10, getStruct: boolean = false, fee?: number, -) => generateTransaction(network, DELEGATE_REGISTRATION, passphrase, undefined, undefined, quantity, getStruct, fee); +) => generateTransaction(network, DelegateRegistration, passphrase, undefined, undefined, quantity, getStruct, fee); diff --git a/packages/core-test-utils/src/generators/transactions/signature.ts b/packages/core-test-utils/src/generators/transactions/signature.ts index fe934d178a..4310936cd5 100644 --- a/packages/core-test-utils/src/generators/transactions/signature.ts +++ b/packages/core-test-utils/src/generators/transactions/signature.ts @@ -1,7 +1,7 @@ import { constants } from "@arkecosystem/crypto"; import { generateTransaction } from "./transaction"; -const { SECOND_SIGNATURE } = constants.TRANSACTION_TYPES; +const { SecondSignature } = constants.TransactionTypes; export const generateSecondSignature = ( network, @@ -9,4 +9,4 @@ export const generateSecondSignature = ( quantity: number = 10, getStruct: boolean = false, fee?: number, -) => generateTransaction(network, SECOND_SIGNATURE, passphrase, undefined, undefined, quantity, getStruct, fee); +) => generateTransaction(network, SecondSignature, passphrase, undefined, undefined, quantity, getStruct, fee); diff --git a/packages/core-test-utils/src/generators/transactions/transaction.ts b/packages/core-test-utils/src/generators/transactions/transaction.ts index eb97559363..b27d7d792f 100644 --- a/packages/core-test-utils/src/generators/transactions/transaction.ts +++ b/packages/core-test-utils/src/generators/transactions/transaction.ts @@ -3,7 +3,7 @@ import superheroes from "superheroes"; import { delegatesSecrets } from "../../fixtures/testnet/passphrases"; const defaultPassphrase = delegatesSecrets[0]; -const { TRANSFER, SECOND_SIGNATURE, DELEGATE_REGISTRATION, VOTE } = constants.TRANSACTION_TYPES; +const { Transfer, SecondSignature, DelegateRegistration, Vote } = constants.TransactionTypes; export const generateTransaction = ( network, @@ -16,14 +16,14 @@ export const generateTransaction = ( fee?: number, ) => { network = network || "testnet"; - type = type || TRANSFER; + type = type || Transfer; passphrase = passphrase || defaultPassphrase; if (!["mainnet", "devnet", "testnet"].includes(network)) { throw new Error("Invalid network"); } - if (![TRANSFER, SECOND_SIGNATURE, DELEGATE_REGISTRATION, VOTE].includes(type)) { + if (![Transfer, SecondSignature, DelegateRegistration, Vote].includes(type)) { throw new Error("Invalid transaction type"); } @@ -33,13 +33,13 @@ export const generateTransaction = ( passphrase = passphrase[0]; } - client.getConfigManager().setFromPreset("ark", network); + client.getConfigManager().setFromPreset(network); const transactions = []; for (let i = 0; i < quantity; i++) { let builder: any = client.getBuilder(); switch (type) { - case TRANSFER: { + case Transfer: { if (!addressOrPublicKey) { addressOrPublicKey = crypto.getAddress(crypto.getKeys(passphrase).publicKey); } @@ -50,11 +50,11 @@ export const generateTransaction = ( .vendorField(`Test Transaction ${i + 1}`); break; } - case SECOND_SIGNATURE: { + case SecondSignature: { builder = builder.secondSignature().signatureAsset(passphrase); break; } - case DELEGATE_REGISTRATION: { + case DelegateRegistration: { const username = superheroes .random() .toLowerCase() @@ -63,7 +63,7 @@ export const generateTransaction = ( builder = builder.delegateRegistration().usernameAsset(username); break; } - case VOTE: { + case Vote: { if (!addressOrPublicKey) { addressOrPublicKey = crypto.getKeys(passphrase).publicKey; } diff --git a/packages/core-test-utils/src/generators/transactions/transfer.ts b/packages/core-test-utils/src/generators/transactions/transfer.ts index 15fe938b06..4f38b55849 100644 --- a/packages/core-test-utils/src/generators/transactions/transfer.ts +++ b/packages/core-test-utils/src/generators/transactions/transfer.ts @@ -1,7 +1,7 @@ import { constants } from "@arkecosystem/crypto"; import { generateTransaction } from "./transaction"; -const { TRANSFER } = constants.TRANSACTION_TYPES; +const { Transfer } = constants.TransactionTypes; export const generateTransfers = ( network, @@ -11,4 +11,4 @@ export const generateTransfers = ( quantity: number = 10, getStruct: boolean = false, fee?: number, -) => generateTransaction(network, TRANSFER, passphrase, address, amount, quantity, getStruct, fee); +) => generateTransaction(network, Transfer, passphrase, address, amount, quantity, getStruct, fee); diff --git a/packages/core-test-utils/src/generators/transactions/vote.ts b/packages/core-test-utils/src/generators/transactions/vote.ts index 1ab5fc9c3d..518990550c 100644 --- a/packages/core-test-utils/src/generators/transactions/vote.ts +++ b/packages/core-test-utils/src/generators/transactions/vote.ts @@ -1,7 +1,7 @@ import { constants } from "@arkecosystem/crypto"; import { generateTransaction } from "./transaction"; -const { VOTE } = constants.TRANSACTION_TYPES; +const { Vote } = constants.TransactionTypes; export const generateVote = ( network, @@ -10,4 +10,4 @@ export const generateVote = ( quantity: number = 10, getStruct: boolean = false, fee?: number, -) => generateTransaction(network, VOTE, passphrase, publicKey, undefined, quantity, getStruct, fee); +) => generateTransaction(network, Vote, passphrase, publicKey, undefined, quantity, getStruct, fee); diff --git a/packages/core-test-utils/src/generators/wallets.ts b/packages/core-test-utils/src/generators/wallets.ts index 1ee54a71c0..ddefcd2b8a 100644 --- a/packages/core-test-utils/src/generators/wallets.ts +++ b/packages/core-test-utils/src/generators/wallets.ts @@ -7,7 +7,7 @@ export const generateWallets = (network, quantity = 10) => { throw new Error("Invalid network"); } - client.getConfigManager().setFromPreset("ark", network); + client.getConfigManager().setFromPreset(network); const wallets = []; for (let i = 0; i < quantity; i++) { diff --git a/packages/core-test-utils/src/matchers/transactions/types/delegate-resignation.ts b/packages/core-test-utils/src/matchers/transactions/types/delegate-resignation.ts index d8940f4f6d..4bcdd1be51 100644 --- a/packages/core-test-utils/src/matchers/transactions/types/delegate-resignation.ts +++ b/packages/core-test-utils/src/matchers/transactions/types/delegate-resignation.ts @@ -1,5 +1,5 @@ import { constants } from "@arkecosystem/crypto"; -const { DELEGATE_RESIGNATION } = constants.TRANSACTION_TYPES; +const { DelegateResignation } = constants.TransactionTypes; export {}; @@ -15,8 +15,8 @@ declare global { expect.extend({ toBeDelegateResignationType: received => { return { - message: () => "Expected value to be a valid DELEGATE_RESIGNATION transaction.", - pass: received.type === DELEGATE_RESIGNATION, + message: () => "Expected value to be a valid DelegateResignation transaction.", + pass: received.type === DelegateResignation, }; }, }); diff --git a/packages/core-test-utils/src/matchers/transactions/types/delegate.ts b/packages/core-test-utils/src/matchers/transactions/types/delegate.ts index 89c2230e20..d4820934be 100644 --- a/packages/core-test-utils/src/matchers/transactions/types/delegate.ts +++ b/packages/core-test-utils/src/matchers/transactions/types/delegate.ts @@ -1,6 +1,6 @@ import { constants } from "@arkecosystem/crypto"; -const { DELEGATE_REGISTRATION } = constants.TRANSACTION_TYPES; +const { DelegateRegistration } = constants.TransactionTypes; export {}; @@ -17,7 +17,7 @@ expect.extend({ toBeDelegateType: received => { return { message: () => "Expected value to be a valid DELEGATE transaction.", - pass: received.type === DELEGATE_REGISTRATION, + pass: received.type === DelegateRegistration, }; }, }); diff --git a/packages/core-test-utils/src/matchers/transactions/types/ipfs.ts b/packages/core-test-utils/src/matchers/transactions/types/ipfs.ts index fd53f4d389..637bb42389 100644 --- a/packages/core-test-utils/src/matchers/transactions/types/ipfs.ts +++ b/packages/core-test-utils/src/matchers/transactions/types/ipfs.ts @@ -1,6 +1,6 @@ import { constants } from "@arkecosystem/crypto"; -const { IPFS } = constants.TRANSACTION_TYPES; +const { Ipfs } = constants.TransactionTypes; export {}; @@ -17,7 +17,7 @@ expect.extend({ toBeIpfsType: received => { return { message: () => "Expected value to be a valid IPFS transaction.", - pass: received.type === IPFS, + pass: received.type === Ipfs, }; }, }); diff --git a/packages/core-test-utils/src/matchers/transactions/types/multi-payment.ts b/packages/core-test-utils/src/matchers/transactions/types/multi-payment.ts index ffc4afd70a..aa7d1aa1f3 100644 --- a/packages/core-test-utils/src/matchers/transactions/types/multi-payment.ts +++ b/packages/core-test-utils/src/matchers/transactions/types/multi-payment.ts @@ -1,6 +1,6 @@ import { constants } from "@arkecosystem/crypto"; -const { MULTI_PAYMENT } = constants.TRANSACTION_TYPES; +const { MultiPayment } = constants.TransactionTypes; export {}; @@ -16,8 +16,8 @@ declare global { expect.extend({ toBeMultiPaymentType: received => { return { - message: () => "Expected value to be a valid MULTI_PAYMENT transaction.", - pass: received.type === MULTI_PAYMENT, + message: () => "Expected value to be a valid MultiPayment transaction.", + pass: received.type === MultiPayment, }; }, }); diff --git a/packages/core-test-utils/src/matchers/transactions/types/multi-signature.ts b/packages/core-test-utils/src/matchers/transactions/types/multi-signature.ts index 4ce3cb36f5..7697b0e883 100644 --- a/packages/core-test-utils/src/matchers/transactions/types/multi-signature.ts +++ b/packages/core-test-utils/src/matchers/transactions/types/multi-signature.ts @@ -1,6 +1,6 @@ import { constants } from "@arkecosystem/crypto"; -const { MULTI_SIGNATURE } = constants.TRANSACTION_TYPES; +const { MultiSignature } = constants.TransactionTypes; export {}; @@ -16,8 +16,8 @@ declare global { expect.extend({ toBeMultiSignatureType: received => { return { - message: () => "Expected value to be a valid MULTI_SIGNATURE transaction.", - pass: received.type === MULTI_SIGNATURE, + message: () => "Expected value to be a valid MultiSignature transaction.", + pass: received.type === MultiSignature, }; }, }); diff --git a/packages/core-test-utils/src/matchers/transactions/types/second-signature.ts b/packages/core-test-utils/src/matchers/transactions/types/second-signature.ts index 5e6535f6f7..f118d6dd8c 100644 --- a/packages/core-test-utils/src/matchers/transactions/types/second-signature.ts +++ b/packages/core-test-utils/src/matchers/transactions/types/second-signature.ts @@ -1,6 +1,6 @@ import { constants } from "@arkecosystem/crypto"; -const { SECOND_SIGNATURE } = constants.TRANSACTION_TYPES; +const { SecondSignature } = constants.TransactionTypes; export {}; @@ -16,8 +16,8 @@ declare global { expect.extend({ toBeSecondSignatureType: received => { return { - message: () => "Expected value to be a valid SECOND_SIGNATURE transaction.", - pass: received.type === SECOND_SIGNATURE, + message: () => "Expected value to be a valid SecondSignature transaction.", + pass: received.type === SecondSignature, }; }, }); diff --git a/packages/core-test-utils/src/matchers/transactions/types/timelock-transfer.ts b/packages/core-test-utils/src/matchers/transactions/types/timelock-transfer.ts index d8845eb2f7..140fd6137d 100644 --- a/packages/core-test-utils/src/matchers/transactions/types/timelock-transfer.ts +++ b/packages/core-test-utils/src/matchers/transactions/types/timelock-transfer.ts @@ -1,6 +1,6 @@ import { constants } from "@arkecosystem/crypto"; -const { TIMELOCK_TRANSFER } = constants.TRANSACTION_TYPES; +const { TimelockTransfer } = constants.TransactionTypes; export {}; @@ -16,8 +16,8 @@ declare global { expect.extend({ toBeTimelockTransferType: received => { return { - message: () => "Expected value to be a valid TIMELOCK_TRANSFER transaction.", - pass: received.type === TIMELOCK_TRANSFER, + message: () => "Expected value to be a valid TimelockTransfer transaction.", + pass: received.type === TimelockTransfer, }; }, }); diff --git a/packages/core-test-utils/src/matchers/transactions/types/transfer.ts b/packages/core-test-utils/src/matchers/transactions/types/transfer.ts index 574ab1ffb9..5678bb97a9 100644 --- a/packages/core-test-utils/src/matchers/transactions/types/transfer.ts +++ b/packages/core-test-utils/src/matchers/transactions/types/transfer.ts @@ -1,6 +1,6 @@ import { constants } from "@arkecosystem/crypto"; -const { TRANSFER } = constants.TRANSACTION_TYPES; +const { Transfer } = constants.TransactionTypes; export {}; @@ -16,8 +16,8 @@ declare global { expect.extend({ toBeTransferType: received => { return { - message: () => "Expected value to be a valid TRANSFER transaction.", - pass: received.type === TRANSFER, + message: () => "Expected value to be a valid Transfer transaction.", + pass: received.type === Transfer, }; }, }); diff --git a/packages/core-test-utils/src/matchers/transactions/types/vote.ts b/packages/core-test-utils/src/matchers/transactions/types/vote.ts index ff866b0478..6ccb661270 100644 --- a/packages/core-test-utils/src/matchers/transactions/types/vote.ts +++ b/packages/core-test-utils/src/matchers/transactions/types/vote.ts @@ -1,6 +1,6 @@ import { constants } from "@arkecosystem/crypto"; -const { VOTE } = constants.TRANSACTION_TYPES; +const { Vote } = constants.TransactionTypes; export {}; @@ -17,7 +17,7 @@ expect.extend({ toBeVoteType: received => { return { message: () => "Expected value to be a valid VOTE transaction.", - pass: received.type === VOTE, + pass: received.type === Vote, }; }, }); diff --git a/packages/core-transaction-pool/__tests__/connection.test.ts b/packages/core-transaction-pool/__tests__/connection.test.ts index 6d77092a5f..b8a75b642d 100644 --- a/packages/core-transaction-pool/__tests__/connection.test.ts +++ b/packages/core-transaction-pool/__tests__/connection.test.ts @@ -11,7 +11,7 @@ import randomSeed from "random-seed"; import { transactions as mockData } from "./__fixtures__/transactions"; import { setUpFull, tearDown } from "./__support__/setup"; -const { ARKTOSHI, TRANSACTION_TYPES } = constants; +const { ARKTOSHI, TransactionTypes } = constants; const { Transaction } = models; const { generateTransfers } = generators; @@ -24,7 +24,7 @@ let connection; beforeAll(async () => { await setUpFull(); - config = app.resolvePlugin("config"); + config = app.getConfig(); database = app.resolvePlugin("database"); connection = app.resolvePlugin("transactionPool"); @@ -146,7 +146,7 @@ describe("Connection", () => { transactions.push(new Transaction(mockData.dummy1)); // transactions[transactions.length - 1].type = - // TRANSACTION_TYPES.TIMELOCK_TRANSFER + // TransactionTypes.TimelockTransfer // Workaround: Increase balance of sender wallet to succeed const insufficientBalanceTx: any = new Transaction(mockData.dummyExp2); @@ -362,7 +362,7 @@ describe("Connection", () => { it("should be false for non-existent sender", () => { connection.addTransaction(mockData.dummy1); - expect(connection.senderHasTransactionsOfType("nonexistent", TRANSACTION_TYPES.VOTE)).toBeFalse(); + expect(connection.senderHasTransactionsOfType("nonexistent", TransactionTypes.Vote)).toBeFalse(); }); it("should be false for existent sender with no votes", () => { @@ -370,7 +370,7 @@ describe("Connection", () => { connection.addTransaction(tx); - expect(connection.senderHasTransactionsOfType(tx.senderPublicKey, TRANSACTION_TYPES.VOTE)).toBeFalse(); + expect(connection.senderHasTransactionsOfType(tx.senderPublicKey, TransactionTypes.Vote)).toBeFalse(); }); it("should be true for existent sender with votes", () => { @@ -381,7 +381,7 @@ describe("Connection", () => { const voteTx = new Transaction(tx); voteTx.id = "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"; - voteTx.type = TRANSACTION_TYPES.VOTE; + voteTx.type = TransactionTypes.Vote; voteTx.amount = bignumify(0); voteTx.asset = { votes: [`+${tx.senderPublicKey}`] }; @@ -389,7 +389,7 @@ describe("Connection", () => { connection.addTransactions(transactions); - expect(connection.senderHasTransactionsOfType(tx.senderPublicKey, TRANSACTION_TYPES.VOTE)).toBeTrue(); + expect(connection.senderHasTransactionsOfType(tx.senderPublicKey, TransactionTypes.Vote)).toBeTrue(); }); }); @@ -426,7 +426,7 @@ describe("Connection", () => { const forgedTransaction = block.transactions[0]; // Workaround: Add tx to exceptions so it gets applied, because the fee is 0. - config.network.exceptions.transactions = [forgedTransaction.id]; + config.set("exceptions.transactions", [forgedTransaction.id]); // For some reason all genesis transactions fail signature verification, so // they are not loaded from the local storage and this fails otherwise. diff --git a/packages/core-transaction-pool/__tests__/dynamic-fee.test.ts b/packages/core-transaction-pool/__tests__/dynamic-fee.test.ts index 316094b165..0eceb8cba0 100644 --- a/packages/core-transaction-pool/__tests__/dynamic-fee.test.ts +++ b/packages/core-transaction-pool/__tests__/dynamic-fee.test.ts @@ -1,4 +1,5 @@ -import { dynamicFeeMatcher } from "../src/utils/dynamicfee-matcher"; +import { config } from "../src/config"; +import { dynamicFeeMatcher } from "../src/dynamic-fee/matcher"; import { transactions } from "./__fixtures__/transactions"; import { setUpFull, tearDown } from "./__support__/setup"; @@ -7,6 +8,7 @@ let container; beforeAll(async () => { container = await setUpFull(); + config.init(container.resolveOptions("transactionPool")); }); afterAll(async () => { @@ -21,8 +23,8 @@ describe("static fees", () => { height: 20, }, })); - const h = blockchain.getLastBlock().data.height; - container.resolvePlugin("config").getConstants(h).fees.dynamic = false; + + config.set("dynamicFees.enabled", false); }); it("should accept transactions matching the static fee for broadcast", () => { @@ -54,8 +56,8 @@ describe("dynamic fees", () => { height: 20, }, })); - const h = blockchain.getLastBlock().data.height; - container.resolvePlugin("config").getConstants(h).fees.dynamic = true; + + config.set("dynamicFees.enabled", true); }); it("should broadcast transactions with high enough fee", () => { diff --git a/packages/core-transaction-pool/__tests__/guard.test.ts b/packages/core-transaction-pool/__tests__/guard.test.ts index 44ac1e515b..74765e6200 100644 --- a/packages/core-transaction-pool/__tests__/guard.test.ts +++ b/packages/core-transaction-pool/__tests__/guard.test.ts @@ -2,6 +2,7 @@ import { fixtures, generators } from "@arkecosystem/core-test-utils"; import "jest-extended"; import { crypto, slots } from "@arkecosystem/crypto"; +import { config as localConfig } from "../src/config"; import { TransactionGuard } from "../src/guard"; import bip39 from "bip39"; @@ -27,6 +28,7 @@ let transactionPool; beforeAll(async () => { container = await setUpFull(); transactionPool = container.resolvePlugin("transactionPool"); + localConfig.init(transactionPool.options); }); afterAll(async () => { @@ -44,8 +46,8 @@ describe("Transaction Guard", () => { "should not apply transactions for chained transfers involving cold wallets", async inverseOrder => { /* The logic here is we can't have a chained transfer A => B => C if B is a cold wallet. - A => B needs to be first confirmed (forged), then B can transfer to C - */ + A => B needs to be first confirmed (forged), then B can transfer to C + */ const arktoshi = 10 ** 8; // don't re-use the same delegate (need clean balance) diff --git a/packages/core-transaction-pool/src/config.ts b/packages/core-transaction-pool/src/config.ts new file mode 100644 index 0000000000..89130a6208 --- /dev/null +++ b/packages/core-transaction-pool/src/config.ts @@ -0,0 +1,20 @@ +import get from "lodash/get"; +import set from "lodash/set"; + +class Config { + private config: any; + + public init(options: any): void { + this.config = options; + } + + public get(key: string, defaultValue: any = null): any { + return get(this.config, key, defaultValue); + } + + public set(key: string, value: any): void { + set(this.config, key, value); + } +} + +export const config = new Config(); diff --git a/packages/core-transaction-pool/src/connection.ts b/packages/core-transaction-pool/src/connection.ts index 81a207a5ff..9de2fd513e 100644 --- a/packages/core-transaction-pool/src/connection.ts +++ b/packages/core-transaction-pool/src/connection.ts @@ -497,7 +497,7 @@ export class TransactionPool { * in the pool. * @param {String} senderPublicKey public key of the sender * @param {Number} transactionType transaction type, must be one of - * TRANSACTION_TYPES.* and is compared against transaction.type. + * TransactionTypes.* and is compared against transaction.type. * @return {Boolean} true if exist */ public senderHasTransactionsOfType(senderPublicKey, transactionType) { diff --git a/packages/core-transaction-pool/src/defaults.ts b/packages/core-transaction-pool/src/defaults.ts index e12e784fbb..0ef494b159 100644 --- a/packages/core-transaction-pool/src/defaults.ts +++ b/packages/core-transaction-pool/src/defaults.ts @@ -11,4 +11,20 @@ export const defaults = { allowedSenders: [], maxTransactionsPerRequest: process.env.ARK_TRANSACTION_POOL_MAX_PER_REQUEST || 40, maxTransactionAge: 2700, + dynamicFees: { + enabled: true, + minFeePool: 3000, + minFeeBroadcast: 3000, + addonBytes: { + transfer: 100, + secondSignature: 250, + delegateRegistration: 400000, + vote: 100, + multiSignature: 500, + ipfs: 250, + timelockTransfer: 500, + multiPayment: 500, + delegateResignation: 400000, + }, + }, }; diff --git a/packages/core-transaction-pool/src/dynamic-fee/index.ts b/packages/core-transaction-pool/src/dynamic-fee/index.ts new file mode 100644 index 0000000000..9bf385052f --- /dev/null +++ b/packages/core-transaction-pool/src/dynamic-fee/index.ts @@ -0,0 +1,3 @@ +import { calculateFee, dynamicFeeMatcher } from "./matcher"; + +export { calculateFee, dynamicFeeMatcher }; diff --git a/packages/core-transaction-pool/src/utils/dynamicfee-matcher.ts b/packages/core-transaction-pool/src/dynamic-fee/matcher.ts similarity index 70% rename from packages/core-transaction-pool/src/utils/dynamicfee-matcher.ts rename to packages/core-transaction-pool/src/dynamic-fee/matcher.ts index 3cbb401b2b..c04a8a6ed2 100644 --- a/packages/core-transaction-pool/src/utils/dynamicfee-matcher.ts +++ b/packages/core-transaction-pool/src/dynamic-fee/matcher.ts @@ -1,5 +1,28 @@ import { app } from "@arkecosystem/core-container"; -import { dynamicFeeManager, feeManager, formatArktoshi } from "@arkecosystem/crypto"; +import { constants, feeManager, formatArktoshi } from "@arkecosystem/crypto"; +import camelCase from "lodash/camelCase"; +import { config as localConfig } from "../config"; + +/** + * Calculate minimum fee of a transaction for entering the pool. + * @param {Number} Minimum fee ARKTOSHI/byte + * @param {Transaction} Transaction for which we calculate the fee + * @returns {Number} Calculated minimum acceptable fee in ARKTOSHI + */ +export function calculateFee(arktoshiPerByte, transaction) { + if (arktoshiPerByte <= 0) { + arktoshiPerByte = 1; + } + + const addonBytes = localConfig.get("dynamicFees.addonBytes")[ + camelCase(constants.TransactionTypes[transaction.type]) + ]; + + // serialized is in hex + const transactionSizeInBytes = transaction.serialized.length / 2; + + return (addonBytes + transactionSizeInBytes) * arktoshiPerByte; +} /** * Determine if a transaction's fee meets the minimum requirements for broadcasting @@ -8,20 +31,19 @@ import { dynamicFeeManager, feeManager, formatArktoshi } from "@arkecosystem/cry * @return {Object} { broadcast: Boolean, enterPool: Boolean } */ export function dynamicFeeMatcher(transaction) { - const config = app.resolvePlugin("config"); const logger = app.resolvePlugin("logger"); const fee = +transaction.fee.toFixed(); const id = transaction.id; - const blockchain = app.resolvePlugin("blockchain"); - const fees = config.getConstants(blockchain.getLastBlock().data.height).fees; + const dynamicFees = localConfig.get("dynamicFees"); let broadcast; let enterPool; - if (fees.dynamic) { - const minFeeBroadcast = dynamicFeeManager.calculateFee(fees.dynamicFees.minFeeBroadcast, transaction); + if (dynamicFees.enabled) { + const minFeeBroadcast = calculateFee(dynamicFees.minFeeBroadcast, transaction); + if (fee >= minFeeBroadcast) { broadcast = true; logger.debug( @@ -38,7 +60,7 @@ export function dynamicFeeMatcher(transaction) { ); } - const minFeePool = dynamicFeeManager.calculateFee(fees.dynamicFees.minFeePool, transaction); + const minFeePool = calculateFee(dynamicFees.minFeePool, transaction); if (fee >= minFeePool) { enterPool = true; logger.debug( diff --git a/packages/core-transaction-pool/src/guard.ts b/packages/core-transaction-pool/src/guard.ts index 86d9a722bc..2b45f0dec6 100644 --- a/packages/core-transaction-pool/src/guard.ts +++ b/packages/core-transaction-pool/src/guard.ts @@ -2,10 +2,10 @@ import { app } from "@arkecosystem/core-container"; import { configManager, constants, models, slots } from "@arkecosystem/crypto"; import pluralize from "pluralize"; -const { TRANSACTION_TYPES } = constants; +const { TransactionTypes } = constants; const { Transaction } = models; -import { dynamicFeeMatcher } from "./utils/dynamicfee-matcher"; +import { dynamicFeeMatcher } from "./dynamic-fee"; import { isRecipientOnActiveNetwork } from "./utils/is-on-active-network"; export class TransactionGuard { @@ -183,7 +183,7 @@ export class TransactionGuard { } switch (transaction.type) { - case TRANSACTION_TYPES.TRANSFER: + case TransactionTypes.Transfer: if (!isRecipientOnActiveNetwork(transaction)) { this.__pushError( transaction, @@ -195,30 +195,29 @@ export class TransactionGuard { return false; } break; - case TRANSACTION_TYPES.SECOND_SIGNATURE: - case TRANSACTION_TYPES.DELEGATE_REGISTRATION: - case TRANSACTION_TYPES.VOTE: + case TransactionTypes.SecondSignature: + case TransactionTypes.DelegateRegistration: + case TransactionTypes.Vote: if (this.pool.senderHasTransactionsOfType(transaction.senderPublicKey, transaction.type)) { this.__pushError( transaction, "ERR_PENDING", `Sender ${transaction.senderPublicKey} already has a transaction of type ` + - `'${TRANSACTION_TYPES.toString(transaction.type)}' in the pool`, + `'${TransactionTypes[transaction.type]}' in the pool`, ); return false; } break; - case TRANSACTION_TYPES.MULTI_SIGNATURE: - case TRANSACTION_TYPES.IPFS: - case TRANSACTION_TYPES.TIMELOCK_TRANSFER: - case TRANSACTION_TYPES.MULTI_PAYMENT: - case TRANSACTION_TYPES.DELEGATE_RESIGNATION: + case TransactionTypes.MultiSignature: + case TransactionTypes.Ipfs: + case TransactionTypes.TimelockTransfer: + case TransactionTypes.MultiPayment: + case TransactionTypes.DelegateResignation: default: this.__pushError( transaction, "ERR_UNSUPPORTED", - "Invalidating transaction of unsupported type " + - `'${TRANSACTION_TYPES.toString(transaction.type)}'`, + "Invalidating transaction of unsupported type " + `'${TransactionTypes[transaction.type]}'`, ); return false; } diff --git a/packages/core-transaction-pool/src/index.ts b/packages/core-transaction-pool/src/index.ts index 0ef33af36d..3c3510e5f6 100644 --- a/packages/core-transaction-pool/src/index.ts +++ b/packages/core-transaction-pool/src/index.ts @@ -1,3 +1,4 @@ +import { config } from "./config"; import { TransactionPool } from "./connection"; import { defaults } from "./defaults"; import { transactionPoolManager } from "./manager"; @@ -11,13 +12,14 @@ const plugin = { defaults, alias: "transactionPool", async register(container, options) { + config.init(options); + container.resolvePlugin("logger").info("Connecting to transaction pool"); await transactionPoolManager.makeConnection(new TransactionPool(options)); return transactionPoolManager.connection(); }, - async deregister(container, options) { container.resolvePlugin("logger").info("Disconnecting from transaction pool"); @@ -31,4 +33,4 @@ const plugin = { */ import { TransactionGuard } from "./guard"; -export { plugin, TransactionPool, TransactionGuard }; +export { config, plugin, TransactionPool, TransactionGuard }; diff --git a/packages/core-transaction-pool/src/mem-pool-transaction.ts b/packages/core-transaction-pool/src/mem-pool-transaction.ts index 412e956109..7ca0e015ef 100644 --- a/packages/core-transaction-pool/src/mem-pool-transaction.ts +++ b/packages/core-transaction-pool/src/mem-pool-transaction.ts @@ -3,7 +3,7 @@ import { constants, models } from "@arkecosystem/crypto"; import assert from "assert"; -const { TRANSACTION_TYPES } = constants; +const { TransactionTypes } = constants; const { Transaction } = models; /** @@ -60,7 +60,7 @@ export class MemPoolTransaction { return t.expiration; } - if (t.type !== TRANSACTION_TYPES.TIMELOCK_TRANSFER) { + if (t.type !== TransactionTypes.TimelockTransfer) { return t.timestamp + maxTransactionAge; } diff --git a/packages/core-transaction-pool/src/pool-wallet-manager.ts b/packages/core-transaction-pool/src/pool-wallet-manager.ts index dc3bad08c3..c62c91ed75 100644 --- a/packages/core-transaction-pool/src/pool-wallet-manager.ts +++ b/packages/core-transaction-pool/src/pool-wallet-manager.ts @@ -3,7 +3,7 @@ import { WalletManager } from "@arkecosystem/core-database"; import { constants, crypto, models } from "@arkecosystem/crypto"; const { Wallet } = models; -const { TRANSACTION_TYPES } = constants; +const { TransactionTypes } = constants; export class PoolWalletManager extends WalletManager { public database: any; @@ -81,7 +81,7 @@ export class PoolWalletManager extends WalletManager { const { type, asset } = transaction; if ( - type === TRANSACTION_TYPES.DELEGATE_REGISTRATION && + type === TransactionTypes.DelegateRegistration && this.database.walletManager.byUsername[asset.delegate.username.toLowerCase()] ) { this.logger.error( @@ -93,7 +93,7 @@ export class PoolWalletManager extends WalletManager { errors.push(`Can't apply transaction ${transaction.id}: delegate name already taken.`); // NOTE: We use the vote public key, because vote transactions have the same sender and recipient. } else if ( - type === TRANSACTION_TYPES.VOTE && + type === TransactionTypes.Vote && !this.database.walletManager.__isDelegate(asset.votes[0].slice(1)) ) { this.logger.error( diff --git a/packages/core-utils/__tests__/__support__/mocks/core-container-calculator.ts b/packages/core-utils/__tests__/__support__/mocks/core-container-calculator.ts index cdb294c3fe..d895682cbe 100644 --- a/packages/core-utils/__tests__/__support__/mocks/core-container-calculator.ts +++ b/packages/core-utils/__tests__/__support__/mocks/core-container-calculator.ts @@ -1,10 +1,22 @@ jest.mock("@arkecosystem/core-container", () => { return { app: { + getConfig: () => { + return { + get: () => 1000000 * 1e8, + getMilestone: () => ({ + height: 1, + reward: 2 * 1e8, + }), + genesisBlock: { + totalAmount: 1000000 * 1e8, + }, + }; + }, resolvePlugin: name => { if (name === "config") { return { - getConstants: () => ({ + getMilestone: () => ({ height: 1, reward: 2 * 1e8, }), diff --git a/packages/core-utils/__tests__/__support__/mocks/core-container.ts b/packages/core-utils/__tests__/__support__/mocks/core-container.ts index b4c518c6f7..17aa34a5e2 100644 --- a/packages/core-utils/__tests__/__support__/mocks/core-container.ts +++ b/packages/core-utils/__tests__/__support__/mocks/core-container.ts @@ -1,17 +1,13 @@ jest.mock("@arkecosystem/core-container", () => { return { app: { - resolvePlugin: name => { - if (name === "config") { - return { - getConstants: () => ({ - epoch: "2017-03-21T13:00:00.000Z", - activeDelegates: 51, - }), - }; - } - - return {}; + getConfig: () => { + return { + getMilestone: () => ({ + epoch: "2017-03-21T13:00:00.000Z", + activeDelegates: 51, + }), + }; }, }, }; diff --git a/packages/core-utils/__tests__/delegate-calculator.test.ts b/packages/core-utils/__tests__/delegate-calculator.test.ts index 5bab4fa727..eef8b99b41 100644 --- a/packages/core-utils/__tests__/delegate-calculator.test.ts +++ b/packages/core-utils/__tests__/delegate-calculator.test.ts @@ -1,6 +1,5 @@ import "./__support__/mocks/core-container-calculator"; -import { app } from "@arkecosystem/core-container"; import { Bignum, models } from "@arkecosystem/crypto"; import "jest-extended"; import { calculateApproval, calculateProductivity } from "../src/delegate-calculator"; diff --git a/packages/core-utils/__tests__/supply-calculator.test.ts b/packages/core-utils/__tests__/supply-calculator.test.ts index 6445cdad81..af27cf13bc 100644 --- a/packages/core-utils/__tests__/supply-calculator.test.ts +++ b/packages/core-utils/__tests__/supply-calculator.test.ts @@ -6,15 +6,18 @@ let config; const mockConfig = { genesisBlock: { totalAmount: 1000 }, - network: { constants: [{ height: 1, reward: 2 }] }, + milestones: [{ height: 1, reward: 2 }], }; -app.resolvePlugin = jest.fn(plugin => { - if (plugin === "config") { - return mockConfig; - } +app.getConfig = jest.fn(() => { + return { + all: () => { + return mockConfig; + }, + }; +}); - // FIX: check if that mock is correct +app.resolvePlugin = jest.fn(plugin => { if (plugin === "blockchain") { return { getLastBlock: () => { @@ -31,27 +34,26 @@ app.resolvePlugin = jest.fn(plugin => { }); beforeAll(() => { - config = app.resolvePlugin("config"); + config = app.getConfig().all(); }); -// FIX: the mocks are describe("Supply calculator", () => { it("should calculate supply with milestone at height 2", () => { - mockConfig.network.constants[0].height = 2; + mockConfig.milestones[0].height = 2; expect(calculate(1)).toBe(mockConfig.genesisBlock.totalAmount); - mockConfig.network.constants[0].height = 1; + mockConfig.milestones[0].height = 1; }); describe.each([0, 5, 100, 2000, 4000, 8000])("at height %s", height => { it("should calculate the genesis supply without milestone", () => { const genesisSupply = config.genesisBlock.totalAmount; - expect(calculate(height)).toBe(genesisSupply + height * config.network.constants[0].reward); + expect(calculate(height)).toBe(genesisSupply + height * config.milestones[0].reward); }); }); describe.each([0, 2000, 4000, 8000, 16000])("at height %s", height => { it("should calculate the genesis supply with one milestone", () => { - mockConfig.network.constants.push({ height: 8000, reward: 3 }); + mockConfig.milestones.push({ height: 8000, reward: 3 }); const reward = current => { if (current < 8000) { @@ -64,16 +66,16 @@ describe("Supply calculator", () => { const genesisSupply = config.genesisBlock.totalAmount; expect(calculate(height)).toBe(genesisSupply + reward(height)); - mockConfig.network.constants = [{ height: 1, reward: 2 }]; + mockConfig.milestones = [{ height: 1, reward: 2 }]; }); }); describe.each([0, 4000, 8000, 12000, 16000, 20000, 32000, 48000, 64000, 128000])("at height %s", height => { it("should calculate the genesis supply with four milestones", () => { - mockConfig.network.constants.push({ height: 8000, reward: 4 }); - mockConfig.network.constants.push({ height: 16000, reward: 5 }); - mockConfig.network.constants.push({ height: 32000, reward: 10 }); - mockConfig.network.constants.push({ height: 64000, reward: 15 }); + mockConfig.milestones.push({ height: 8000, reward: 4 }); + mockConfig.milestones.push({ height: 16000, reward: 5 }); + mockConfig.milestones.push({ height: 32000, reward: 10 }); + mockConfig.milestones.push({ height: 64000, reward: 15 }); const reward = current => { if (current < 8000) { @@ -98,7 +100,7 @@ describe("Supply calculator", () => { const genesisSupply = config.genesisBlock.totalAmount; expect(calculate(height)).toBe(genesisSupply + reward(height)); - mockConfig.network.constants = [{ height: 1, reward: 2 }]; + mockConfig.milestones = [{ height: 1, reward: 2 }]; }); }); }); diff --git a/packages/core-utils/src/delegate-calculator.ts b/packages/core-utils/src/delegate-calculator.ts index 81a4cdf1ff..8ceaf7868a 100644 --- a/packages/core-utils/src/delegate-calculator.ts +++ b/packages/core-utils/src/delegate-calculator.ts @@ -10,14 +10,14 @@ const BignumMod = Bignum.clone({ DECIMAL_PLACES: 2 }); * @return {Number} Approval, with 2 decimals */ function calculateApproval(delegate, height: any = null) { - const config = app.resolvePlugin("config"); + const config = app.getConfig(); if (!height) { height = app.resolvePlugin("blockchain").getLastBlock().data.height; } - const constants = config.getConstants(height); - const totalSupply = new BignumMod(config.genesisBlock.totalAmount).plus( + const constants = config.getMilestone(height); + const totalSupply = new BignumMod(config.get("genesisBlock.totalAmount")).plus( (height - constants.height) * constants.reward, ); const voteBalance = new BignumMod(delegate.voteBalance); diff --git a/packages/core-utils/src/format-timestamp.ts b/packages/core-utils/src/format-timestamp.ts index 061e15076b..fccb15518b 100644 --- a/packages/core-utils/src/format-timestamp.ts +++ b/packages/core-utils/src/format-timestamp.ts @@ -7,7 +7,7 @@ import dayjs from "dayjs-ext"; * @return {Object} */ function formatTimestamp(epochStamp) { - const constants = app.resolvePlugin("config").getConstants(1); + const constants = app.getConfig().getMilestone(1); // @ts-ignore const timestamp = dayjs(constants.epoch).add(epochStamp, "seconds"); diff --git a/packages/core-utils/src/round-calculator.ts b/packages/core-utils/src/round-calculator.ts index 28d0d96ef3..0ef1b6694c 100644 --- a/packages/core-utils/src/round-calculator.ts +++ b/packages/core-utils/src/round-calculator.ts @@ -7,8 +7,8 @@ import { app } from "@arkecosystem/core-container"; * @return {Object} */ function calculateRound(height, maxDelegates: any = null) { - const config = app.resolvePlugin("config"); - maxDelegates = maxDelegates || config.getConstants(height).activeDelegates; + const config = app.getConfig(); + maxDelegates = maxDelegates || config.getMilestone(height).activeDelegates; const round = Math.floor((height - 1) / maxDelegates) + 1; const nextRound = Math.floor(height / maxDelegates) + 1; @@ -22,8 +22,8 @@ function calculateRound(height, maxDelegates: any = null) { * @return {boolean} true if new round, false if not */ function isNewRound(height) { - const config = app.resolvePlugin("config"); - const maxDelegates = config.getConstants(height).activeDelegates; + const config = app.getConfig(); + const maxDelegates = config.getMilestone(height).activeDelegates; return height % maxDelegates === 1; } diff --git a/packages/core-utils/src/supply-calculator.ts b/packages/core-utils/src/supply-calculator.ts index e79bf7f320..9eb518338d 100644 --- a/packages/core-utils/src/supply-calculator.ts +++ b/packages/core-utils/src/supply-calculator.ts @@ -1,5 +1,5 @@ import { app } from "@arkecosystem/core-container"; -import { Bignum } from "@arkecosystem/crypto"; +import { Bignum, configManager } from "@arkecosystem/crypto"; /** * Calculate the total supply at the given height @@ -7,16 +7,15 @@ import { Bignum } from "@arkecosystem/crypto"; * @return {Number} */ function calculate(height) { - const config = app.resolvePlugin("config"); - const network = config.network; + const { genesisBlock, milestones } = app.getConfig().all(); if (!height) { const blockchain = app.resolvePlugin("blockchain"); height = blockchain ? blockchain.getLastBlock().data.height : 0; } - if (height === 0 || network.constants.length === 0) { - return config.genesisBlock.totalAmount; + if (height === 0 || milestones.length === 0) { + return genesisBlock.totalAmount; } let rewards = Bignum.ZERO; @@ -24,8 +23,8 @@ function calculate(height) { let constantIndex = 0; while (currentHeight < height) { - const constants = network.constants[constantIndex]; - const nextConstants = network.constants[constantIndex + 1]; + const constants = milestones[constantIndex]; + const nextConstants = milestones[constantIndex + 1]; let heightJump = 0; if (nextConstants && height >= nextConstants.height && currentHeight < nextConstants.height - 1) { @@ -42,7 +41,7 @@ function calculate(height) { } } - return +new Bignum(config.genesisBlock.totalAmount).plus(rewards).toFixed(); + return +new Bignum(genesisBlock.totalAmount).plus(rewards).toFixed(); } export { calculate }; diff --git a/packages/core-vote-report/src/handler.ts b/packages/core-vote-report/src/handler.ts index dfb4d63e5d..46fd888ada 100644 --- a/packages/core-vote-report/src/handler.ts +++ b/packages/core-vote-report/src/handler.ts @@ -4,7 +4,7 @@ import { configManager } from "@arkecosystem/crypto"; import sumBy from "lodash/sumBy"; export function handler(request, h) { - const config = app.resolvePlugin("config"); + const config = app.getConfig(); const blockchain = app.resolvePlugin("blockchain"); const database = app.resolvePlugin("database"); @@ -41,7 +41,7 @@ export function handler(request, h) { }); const lastBlock = blockchain.getLastBlock(); - const constants = config.getConstants(lastBlock.data.height); + const constants = config.getMilestone(lastBlock.data.height); // @ts-ignore const delegateRows = request.server.app.config.delegateRows; diff --git a/packages/core/__tests__/__support__/app.ts b/packages/core/__tests__/__support__/app.ts index 39730be791..42b7c8c9af 100644 --- a/packages/core/__tests__/__support__/app.ts +++ b/packages/core/__tests__/__support__/app.ts @@ -5,6 +5,7 @@ export const opts = { config: resolve(__dirname, "./config"), token: "ark", network: "testnet", + skipPlugins: true, }; export const version = "2.0.0"; diff --git a/packages/core/__tests__/__support__/config/plugins.js b/packages/core/__tests__/__support__/config/plugins.js index fb1c671e5c..bd6ee67b60 100644 --- a/packages/core/__tests__/__support__/config/plugins.js +++ b/packages/core/__tests__/__support__/config/plugins.js @@ -1,6 +1,5 @@ module.exports = { "@arkecosystem/core-event-emitter": {}, - "@arkecosystem/core-config": {}, "@arkecosystem/core-logger-winston": { transports: { console: { diff --git a/packages/core/__tests__/commands/start-forger.test.ts b/packages/core/__tests__/commands/start-forger.test.ts index c8bd3be83a..680a6a4478 100644 --- a/packages/core/__tests__/commands/start-forger.test.ts +++ b/packages/core/__tests__/commands/start-forger.test.ts @@ -2,7 +2,7 @@ import "jest-extended"; import { startForger, startRelay } from "../../src/commands"; import { opts, version } from "../__support__/app"; -describe.skip("Commands - Start Forger", () => { +describe("Commands - Start Forger", () => { it("should be OK", async () => { const relay = await startRelay(opts, version); const forger = await startForger(opts, version); diff --git a/packages/core/__tests__/commands/start-relay-and-forger.test.ts b/packages/core/__tests__/commands/start-relay-and-forger.test.ts index 2211dadd54..9b4001ee68 100644 --- a/packages/core/__tests__/commands/start-relay-and-forger.test.ts +++ b/packages/core/__tests__/commands/start-relay-and-forger.test.ts @@ -2,7 +2,7 @@ import "jest-extended"; import { startRelayAndForger } from "../../src/commands"; import { opts, version } from "../__support__/app"; -describe.skip("Commands - Start Relay & Forger", () => { +describe("Commands - Start Relay & Forger", () => { it("should be OK", async () => { const app = await startRelayAndForger(opts, version); diff --git a/packages/core/__tests__/commands/start-relay.test.ts b/packages/core/__tests__/commands/start-relay.test.ts index bd1856bdd2..f8df498030 100644 --- a/packages/core/__tests__/commands/start-relay.test.ts +++ b/packages/core/__tests__/commands/start-relay.test.ts @@ -3,7 +3,7 @@ import "jest-extended"; import { startRelay } from "../../src/commands"; import { opts, version } from "../__support__/app"; -describe.skip("Commands - Start Relay", () => { +describe("Commands - Start Relay", () => { it("should be OK", async () => { const app = await startRelay(opts, version); diff --git a/packages/core/package.json b/packages/core/package.json index 79a8437e03..07b93ba62a 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -66,7 +66,6 @@ "dependencies": { "@arkecosystem/core-api": "^2.1.0", "@arkecosystem/core-blockchain": "^2.1.0", - "@arkecosystem/core-config": "^2.1.0", "@arkecosystem/core-container": "^2.1.0", "@arkecosystem/core-database-postgres": "^2.1.0", "@arkecosystem/core-forger": "^2.1.0", diff --git a/packages/core/src/commands/index.ts b/packages/core/src/commands/index.ts index 3eda171589..9029283716 100644 --- a/packages/core/src/commands/index.ts +++ b/packages/core/src/commands/index.ts @@ -10,6 +10,7 @@ export async function startRelay(options, version) { networkStart: options.networkStart, }, }, + skipPlugins: options.skipPlugins, }); return app; @@ -19,7 +20,6 @@ export async function startForger(options, version) { await app.setUp(version, options, { include: [ "@arkecosystem/core-event-emitter", - "@arkecosystem/core-config", "@arkecosystem/core-logger", "@arkecosystem/core-logger-winston", "@arkecosystem/core-forger", @@ -31,6 +31,7 @@ export async function startForger(options, version) { password: options.password || process.env.ARK_FORGER_PASSWORD, }, }, + skipPlugins: options.skipPlugins, }); return app; @@ -49,6 +50,7 @@ export async function startRelayAndForger(options, version) { password: options.password || process.env.ARK_FORGER_PASSWORD, }, }, + skipPlugins: options.skipPlugins, }); return app; diff --git a/packages/core/src/config/devnet/plugins.js b/packages/core/src/config/devnet/plugins.js index ae62d89b37..a620a183ff 100644 --- a/packages/core/src/config/devnet/plugins.js +++ b/packages/core/src/config/devnet/plugins.js @@ -1,6 +1,5 @@ module.exports = { "@arkecosystem/core-event-emitter": {}, - "@arkecosystem/core-config": {}, "@arkecosystem/core-logger-winston": { transports: { console: { diff --git a/packages/core/src/config/mainnet/plugins.js b/packages/core/src/config/mainnet/plugins.js index 9b819a1fe9..5fb132a247 100644 --- a/packages/core/src/config/mainnet/plugins.js +++ b/packages/core/src/config/mainnet/plugins.js @@ -1,6 +1,5 @@ module.exports = { "@arkecosystem/core-event-emitter": {}, - "@arkecosystem/core-config": {}, "@arkecosystem/core-logger-winston": { transports: { console: { diff --git a/packages/core/src/config/testnet.1/plugins.js b/packages/core/src/config/testnet.1/plugins.js index a59b723302..11f24d7e15 100644 --- a/packages/core/src/config/testnet.1/plugins.js +++ b/packages/core/src/config/testnet.1/plugins.js @@ -1,6 +1,5 @@ module.exports = { "@arkecosystem/core-event-emitter": {}, - "@arkecosystem/core-config": {}, "@arkecosystem/core-logger-winston": { transports: { console: { diff --git a/packages/core/src/config/testnet.2/plugins.js b/packages/core/src/config/testnet.2/plugins.js index f908679264..d333997dbc 100644 --- a/packages/core/src/config/testnet.2/plugins.js +++ b/packages/core/src/config/testnet.2/plugins.js @@ -1,6 +1,5 @@ module.exports = { "@arkecosystem/core-event-emitter": {}, - "@arkecosystem/core-config": {}, "@arkecosystem/core-logger-winston": { transports: { console: { diff --git a/packages/core/src/config/testnet.live/plugins.js b/packages/core/src/config/testnet.live/plugins.js index b0001130fc..81487482c3 100644 --- a/packages/core/src/config/testnet.live/plugins.js +++ b/packages/core/src/config/testnet.live/plugins.js @@ -1,6 +1,5 @@ module.exports = { "@arkecosystem/core-event-emitter": {}, - "@arkecosystem/core-config": {}, "@arkecosystem/core-logger-winston": { transports: { console: { diff --git a/packages/core/src/config/testnet/plugins.js b/packages/core/src/config/testnet/plugins.js index 046cdb5ae4..5082e160d3 100644 --- a/packages/core/src/config/testnet/plugins.js +++ b/packages/core/src/config/testnet/plugins.js @@ -1,6 +1,5 @@ module.exports = { "@arkecosystem/core-event-emitter": {}, - "@arkecosystem/core-config": {}, "@arkecosystem/core-logger-winston": { transports: { console: { diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 1d0aad4c17..56e7dff989 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -18,7 +18,6 @@ function registerCommand(name: string, description: string): any { .description(description) .option("-d, --data ", "data directory", "~/.ark") .option("-c, --config ", "core config", "~/.ark/config") - .option("-t, --token ", "token name", "ark") .option("-n, --network ", "token network") .option("-r, --remote ", "remote peer for config") .option("--network-start", "force genesis network start", false) @@ -67,7 +66,7 @@ registerCommand("forger-bip38", "encrypt the delegate passphrase using bip38") process.exit(1); } - configManager.setFromPreset(options.token, options.network); + configManager.setFromPreset(options.network); const keys = crypto.getKeys(options.secret); // @ts-ignore diff --git a/packages/crypto/__tests__/builder/transactions/delegate-registration.test.ts b/packages/crypto/__tests__/builder/transactions/delegate-registration.test.ts index 753923cc23..29832e82dd 100644 --- a/packages/crypto/__tests__/builder/transactions/delegate-registration.test.ts +++ b/packages/crypto/__tests__/builder/transactions/delegate-registration.test.ts @@ -1,6 +1,6 @@ import "jest-extended"; import { client as ark } from "../../../src/client"; -import { TRANSACTION_TYPES } from "../../../src/constants"; +import { TransactionTypes } from "../../../src/constants"; import { crypto } from "../../../src/crypto/crypto"; import { feeManager } from "../../../src/managers/fee"; import { transactionBuilder } from "./__shared__/transaction-builder"; @@ -35,9 +35,9 @@ describe("Delegate Registration Transaction", () => { transactionBuilder(); it("should have its specific properties", () => { - expect(builder).toHaveProperty("data.type", TRANSACTION_TYPES.DELEGATE_REGISTRATION); + expect(builder).toHaveProperty("data.type", TransactionTypes.DelegateRegistration); expect(builder).toHaveProperty("data.amount", 0); - expect(builder).toHaveProperty("data.fee", feeManager.get(TRANSACTION_TYPES.DELEGATE_REGISTRATION)); + expect(builder).toHaveProperty("data.fee", feeManager.get(TransactionTypes.DelegateRegistration)); expect(builder).toHaveProperty("data.recipientId", null); expect(builder).toHaveProperty("data.senderPublicKey", null); expect(builder).toHaveProperty("data.asset", { delegate: {} }); diff --git a/packages/crypto/__tests__/builder/transactions/delegate-resignation.test.ts b/packages/crypto/__tests__/builder/transactions/delegate-resignation.test.ts index ac2a478283..6df9994017 100644 --- a/packages/crypto/__tests__/builder/transactions/delegate-resignation.test.ts +++ b/packages/crypto/__tests__/builder/transactions/delegate-resignation.test.ts @@ -1,6 +1,6 @@ import "jest-extended"; import { client as ark } from "../../../src/client"; -import { TRANSACTION_TYPES } from "../../../src/constants"; +import { TransactionTypes } from "../../../src/constants"; import { feeManager } from "../../../src/managers/fee"; import { transactionBuilder } from "./__shared__/transaction-builder"; @@ -17,7 +17,7 @@ describe("Delegate Resignation Transaction", () => { transactionBuilder(); it("should have its specific properties", () => { - expect(builder).toHaveProperty("data.type", TRANSACTION_TYPES.DELEGATE_RESIGNATION); - expect(builder).toHaveProperty("data.fee", feeManager.get(TRANSACTION_TYPES.DELEGATE_RESIGNATION)); + expect(builder).toHaveProperty("data.type", TransactionTypes.DelegateResignation); + expect(builder).toHaveProperty("data.fee", feeManager.get(TransactionTypes.DelegateResignation)); }); }); diff --git a/packages/crypto/__tests__/builder/transactions/ipfs.test.ts b/packages/crypto/__tests__/builder/transactions/ipfs.test.ts index 0302c25051..b3d7fd6f98 100644 --- a/packages/crypto/__tests__/builder/transactions/ipfs.test.ts +++ b/packages/crypto/__tests__/builder/transactions/ipfs.test.ts @@ -1,6 +1,6 @@ import "jest-extended"; import { client as ark } from "../../../src/client"; -import { TRANSACTION_TYPES } from "../../../src/constants"; +import { TransactionTypes } from "../../../src/constants"; import { feeManager } from "../../../src/managers/fee"; import { transactionBuilder } from "./__shared__/transaction-builder"; @@ -17,8 +17,8 @@ describe("IPFS Transaction", () => { transactionBuilder(); it("should have its specific properties", () => { - expect(builder).toHaveProperty("data.type", TRANSACTION_TYPES.IPFS); - expect(builder).toHaveProperty("data.fee", feeManager.get(TRANSACTION_TYPES.IPFS)); + expect(builder).toHaveProperty("data.type", TransactionTypes.Ipfs); + expect(builder).toHaveProperty("data.fee", feeManager.get(TransactionTypes.Ipfs)); expect(builder).toHaveProperty("data.amount", 0); expect(builder).toHaveProperty("data.vendorFieldHex", null); expect(builder).toHaveProperty("data.senderPublicKey", null); diff --git a/packages/crypto/__tests__/builder/transactions/multi-payment.test.ts b/packages/crypto/__tests__/builder/transactions/multi-payment.test.ts index 17de3f557e..c5992870fc 100644 --- a/packages/crypto/__tests__/builder/transactions/multi-payment.test.ts +++ b/packages/crypto/__tests__/builder/transactions/multi-payment.test.ts @@ -1,6 +1,6 @@ import "jest-extended"; import { client as ark } from "../../../src/client"; -import { TRANSACTION_TYPES } from "../../../src/constants"; +import { TransactionTypes } from "../../../src/constants"; import { feeManager } from "../../../src/managers/fee"; import { transactionBuilder } from "./__shared__/transaction-builder"; @@ -17,8 +17,8 @@ describe("Multi Payment Transaction", () => { transactionBuilder(); it("should have its specific properties", () => { - expect(builder).toHaveProperty("data.type", TRANSACTION_TYPES.MULTI_PAYMENT); - expect(builder).toHaveProperty("data.fee", feeManager.get(TRANSACTION_TYPES.MULTI_PAYMENT)); + expect(builder).toHaveProperty("data.type", TransactionTypes.MultiPayment); + expect(builder).toHaveProperty("data.fee", feeManager.get(TransactionTypes.MultiPayment)); expect(builder).toHaveProperty("data.payments", {}); expect(builder).toHaveProperty("data.vendorFieldHex", null); }); diff --git a/packages/crypto/__tests__/builder/transactions/multi-signature.test.ts b/packages/crypto/__tests__/builder/transactions/multi-signature.test.ts index 2398c98b07..f8c2ccb262 100644 --- a/packages/crypto/__tests__/builder/transactions/multi-signature.test.ts +++ b/packages/crypto/__tests__/builder/transactions/multi-signature.test.ts @@ -1,6 +1,6 @@ import "jest-extended"; import { client as ark } from "../../../src/client"; -import { TRANSACTION_TYPES } from "../../../src/constants"; +import { TransactionTypes } from "../../../src/constants"; import { crypto } from "../../../src/crypto/crypto"; import { feeManager } from "../../../src/managers/fee"; import { transactionBuilder } from "./__shared__/transaction-builder"; @@ -39,7 +39,7 @@ describe("Multi Signature Transaction", () => { transactionBuilder(); it("should have its specific properties", () => { - expect(builder).toHaveProperty("data.type", TRANSACTION_TYPES.MULTI_SIGNATURE); + expect(builder).toHaveProperty("data.type", TransactionTypes.MultiSignature); expect(builder).toHaveProperty("data.fee", 0); expect(builder).toHaveProperty("data.amount", 0); expect(builder).toHaveProperty("data.recipientId", null); @@ -49,7 +49,7 @@ describe("Multi Signature Transaction", () => { }); describe("multiSignatureAsset", () => { - const multiSignatureFee = feeManager.get(TRANSACTION_TYPES.MULTI_SIGNATURE); + const multiSignatureFee = feeManager.get(TransactionTypes.MultiSignature); const multisignature = { keysgroup: ["key a", "key b", "key c"], lifetime: 1, diff --git a/packages/crypto/__tests__/builder/transactions/second-signature.test.ts b/packages/crypto/__tests__/builder/transactions/second-signature.test.ts index 0d68f17a9a..d9e6939be8 100644 --- a/packages/crypto/__tests__/builder/transactions/second-signature.test.ts +++ b/packages/crypto/__tests__/builder/transactions/second-signature.test.ts @@ -1,6 +1,6 @@ import "jest-extended"; import { client as ark } from "../../../src/client"; -import { TRANSACTION_TYPES } from "../../../src/constants"; +import { TransactionTypes } from "../../../src/constants"; import { crypto } from "../../../src/crypto/crypto"; import { feeManager } from "../../../src/managers/fee"; import { transactionBuilder } from "./__shared__/transaction-builder"; @@ -26,8 +26,8 @@ describe("Second Signature Transaction", () => { transactionBuilder(); it("should have its specific properties", () => { - expect(builder).toHaveProperty("data.type", TRANSACTION_TYPES.SECOND_SIGNATURE); - expect(builder).toHaveProperty("data.fee", feeManager.get(TRANSACTION_TYPES.SECOND_SIGNATURE)); + expect(builder).toHaveProperty("data.type", TransactionTypes.SecondSignature); + expect(builder).toHaveProperty("data.fee", feeManager.get(TransactionTypes.SecondSignature)); expect(builder).toHaveProperty("data.amount", 0); expect(builder).toHaveProperty("data.recipientId", null); expect(builder).toHaveProperty("data.senderPublicKey", null); diff --git a/packages/crypto/__tests__/builder/transactions/timelock-transfer.test.ts b/packages/crypto/__tests__/builder/transactions/timelock-transfer.test.ts index cf969656dd..ae411a0f37 100644 --- a/packages/crypto/__tests__/builder/transactions/timelock-transfer.test.ts +++ b/packages/crypto/__tests__/builder/transactions/timelock-transfer.test.ts @@ -1,6 +1,6 @@ import "jest-extended"; import { client as ark } from "../../../src/client"; -import { TRANSACTION_TYPES } from "../../../src/constants"; +import { TransactionTypes } from "../../../src/constants"; import { feeManager } from "../../../src/managers/fee"; import { transactionBuilder } from "./__shared__/transaction-builder"; @@ -17,8 +17,8 @@ describe("Timelock Transfer Transaction", () => { transactionBuilder(); it("should have its specific properties", () => { - expect(builder).toHaveProperty("data.type", TRANSACTION_TYPES.TIMELOCK_TRANSFER); - expect(builder).toHaveProperty("data.fee", feeManager.get(TRANSACTION_TYPES.TIMELOCK_TRANSFER)); + expect(builder).toHaveProperty("data.type", TransactionTypes.TimelockTransfer); + expect(builder).toHaveProperty("data.fee", feeManager.get(TransactionTypes.TimelockTransfer)); expect(builder).toHaveProperty("data.amount", 0); expect(builder).toHaveProperty("data.recipientId", null); expect(builder).toHaveProperty("data.senderPublicKey", null); diff --git a/packages/crypto/__tests__/builder/transactions/transfer.test.ts b/packages/crypto/__tests__/builder/transactions/transfer.test.ts index cb9510d99a..6d9eb0372f 100644 --- a/packages/crypto/__tests__/builder/transactions/transfer.test.ts +++ b/packages/crypto/__tests__/builder/transactions/transfer.test.ts @@ -1,6 +1,6 @@ import "jest-extended"; import { client as ark } from "../../../src/client"; -import { TRANSACTION_TYPES } from "../../../src/constants"; +import { TransactionTypes } from "../../../src/constants"; import { crypto } from "../../../src/crypto"; import { feeManager } from "../../../src/managers/fee"; import { transactionBuilder } from "./__shared__/transaction-builder"; @@ -87,8 +87,8 @@ describe("Transfer Transaction", () => { transactionBuilder(); it("should have its specific properties", () => { - expect(builder).toHaveProperty("data.type", TRANSACTION_TYPES.TRANSFER); - expect(builder).toHaveProperty("data.fee", feeManager.get(TRANSACTION_TYPES.TRANSFER)); + expect(builder).toHaveProperty("data.type", TransactionTypes.Transfer); + expect(builder).toHaveProperty("data.fee", feeManager.get(TransactionTypes.Transfer)); expect(builder).toHaveProperty("data.amount", 0); expect(builder).toHaveProperty("data.recipientId", null); expect(builder).toHaveProperty("data.senderPublicKey", null); diff --git a/packages/crypto/__tests__/builder/transactions/vote.test.ts b/packages/crypto/__tests__/builder/transactions/vote.test.ts index b47d3cf5d6..2b842c75e8 100644 --- a/packages/crypto/__tests__/builder/transactions/vote.test.ts +++ b/packages/crypto/__tests__/builder/transactions/vote.test.ts @@ -1,6 +1,6 @@ import "jest-extended"; import { client as ark } from "../../../src/client"; -import { TRANSACTION_TYPES } from "../../../src/constants"; +import { TransactionTypes } from "../../../src/constants"; import { crypto } from "../../../src/crypto"; import { feeManager } from "../../../src/managers/fee"; import { transactionBuilder } from "./__shared__/transaction-builder"; @@ -37,8 +37,8 @@ describe("Vote Transaction", () => { transactionBuilder(); it("should have its specific properties", () => { - expect(builder).toHaveProperty("data.type", TRANSACTION_TYPES.VOTE); - expect(builder).toHaveProperty("data.fee", feeManager.get(TRANSACTION_TYPES.VOTE)); + expect(builder).toHaveProperty("data.type", TransactionTypes.Vote); + expect(builder).toHaveProperty("data.fee", feeManager.get(TransactionTypes.Vote)); expect(builder).toHaveProperty("data.amount", 0); expect(builder).toHaveProperty("data.recipientId", null); expect(builder).toHaveProperty("data.senderPublicKey", null); diff --git a/packages/crypto/__tests__/constants.test.ts b/packages/crypto/__tests__/constants.test.ts index c2f8b6a632..c8f2aa4b1c 100644 --- a/packages/crypto/__tests__/constants.test.ts +++ b/packages/crypto/__tests__/constants.test.ts @@ -8,45 +8,33 @@ describe("Constants", () => { }); it("transaction types are defined", () => { - expect(constants.TRANSACTION_TYPES).toBeDefined(); - expect(constants.TRANSACTION_TYPES).toBeFrozen(); + expect(constants.TransactionTypes).toBeDefined(); - expect(constants.TRANSACTION_TYPES.TRANSFER).toBeDefined(); - expect(constants.TRANSACTION_TYPES.TRANSFER).toBe(0); + expect(constants.TransactionTypes.Transfer).toBeDefined(); + expect(constants.TransactionTypes.Transfer).toBe(0); - expect(constants.TRANSACTION_TYPES.SECOND_SIGNATURE).toBeDefined(); - expect(constants.TRANSACTION_TYPES.SECOND_SIGNATURE).toBe(1); + expect(constants.TransactionTypes.SecondSignature).toBeDefined(); + expect(constants.TransactionTypes.SecondSignature).toBe(1); - expect(constants.TRANSACTION_TYPES.DELEGATE_REGISTRATION).toBeDefined(); - expect(constants.TRANSACTION_TYPES.DELEGATE_REGISTRATION).toBe(2); + expect(constants.TransactionTypes.DelegateRegistration).toBeDefined(); + expect(constants.TransactionTypes.DelegateRegistration).toBe(2); - expect(constants.TRANSACTION_TYPES.VOTE).toBeDefined(); - expect(constants.TRANSACTION_TYPES.VOTE).toBe(3); + expect(constants.TransactionTypes.Vote).toBeDefined(); + expect(constants.TransactionTypes.Vote).toBe(3); - expect(constants.TRANSACTION_TYPES.MULTI_SIGNATURE).toBeDefined(); - expect(constants.TRANSACTION_TYPES.MULTI_SIGNATURE).toBe(4); + expect(constants.TransactionTypes.MultiSignature).toBeDefined(); + expect(constants.TransactionTypes.MultiSignature).toBe(4); - expect(constants.TRANSACTION_TYPES.IPFS).toBeDefined(); - expect(constants.TRANSACTION_TYPES.IPFS).toBe(5); + expect(constants.TransactionTypes.Ipfs).toBeDefined(); + expect(constants.TransactionTypes.Ipfs).toBe(5); - expect(constants.TRANSACTION_TYPES.TIMELOCK_TRANSFER).toBeDefined(); - expect(constants.TRANSACTION_TYPES.TIMELOCK_TRANSFER).toBe(6); + expect(constants.TransactionTypes.TimelockTransfer).toBeDefined(); + expect(constants.TransactionTypes.TimelockTransfer).toBe(6); - expect(constants.TRANSACTION_TYPES.MULTI_PAYMENT).toBeDefined(); - expect(constants.TRANSACTION_TYPES.MULTI_PAYMENT).toBe(7); + expect(constants.TransactionTypes.MultiPayment).toBeDefined(); + expect(constants.TransactionTypes.MultiPayment).toBe(7); - expect(constants.TRANSACTION_TYPES.DELEGATE_RESIGNATION).toBeDefined(); - expect(constants.TRANSACTION_TYPES.DELEGATE_RESIGNATION).toBe(8); - }); - - it("configurations are defined", () => { - expect(constants.CONFIGURATIONS).toBeDefined(); - expect(constants.CONFIGURATIONS).toBeFrozen(); - - expect(constants.CONFIGURATIONS.ARK.MAINNET).toBeDefined(); - expect(constants.CONFIGURATIONS.ARK.MAINNET).toBeObject(); - - expect(constants.CONFIGURATIONS.ARK.DEVNET).toBeDefined(); - expect(constants.CONFIGURATIONS.ARK.DEVNET).toBeObject(); + expect(constants.TransactionTypes.DelegateResignation).toBeDefined(); + expect(constants.TransactionTypes.DelegateResignation).toBe(8); }); }); diff --git a/packages/crypto/__tests__/crypto/crypto.test.ts b/packages/crypto/__tests__/crypto/crypto.test.ts index 2e578279c9..db8b51c083 100644 --- a/packages/crypto/__tests__/crypto/crypto.test.ts +++ b/packages/crypto/__tests__/crypto/crypto.test.ts @@ -1,9 +1,12 @@ import "jest-extended"; -import { CONFIGURATIONS, TRANSACTION_TYPES } from "../../src/constants"; +import { TransactionTypes } from "../../src/constants"; import { crypto } from "../../src/crypto/crypto"; import { configManager } from "../../src/managers/config"; -beforeEach(() => configManager.setConfig(CONFIGURATIONS.ARK.DEVNET)); +const networkMainnet = configManager.getPreset("mainnet"); +const networkDevnet = configManager.getPreset("devnet"); + +beforeEach(() => configManager.setFromPreset("devnet")); describe("crypto.js", () => { describe("getBytes", () => { @@ -136,7 +139,7 @@ describe("crypto.js", () => { describe("getFee", () => { it("should return 10000000", () => { - const fee = crypto.getFee({ type: TRANSACTION_TYPES.TRANSFER }); + const fee = crypto.getFee({ type: TransactionTypes.Transfer }); expect(fee).toBeNumber(); expect(fee).toBe(10000000); }); @@ -239,9 +242,9 @@ describe("crypto.js", () => { it("should get address from compressed WIF (mainnet)", () => { const keys = crypto.getKeysFromWIF( "SAaaKsDdWMXP5BoVnSBLwTLn48n96UvG42WSUUooRv1HrEHmaSd4", - CONFIGURATIONS.ARK.MAINNET, + networkMainnet.network, ); - const address = crypto.getAddress(keys.publicKey, CONFIGURATIONS.ARK.MAINNET.pubKeyHash); + const address = crypto.getAddress(keys.publicKey, networkMainnet.network.pubKeyHash); expect(keys.compressed).toBeTruthy(); expect(address).toBe("APnrtb2JGa6WjrRik9W3Hjt6h71mD6Zgez"); }); @@ -249,9 +252,9 @@ describe("crypto.js", () => { it("should get address from compressed WIF (devnet)", () => { const keys = crypto.getKeysFromWIF( "SAaaKsDdWMXP5BoVnSBLwTLn48n96UvG42WSUUooRv1HrEHmaSd4", - CONFIGURATIONS.ARK.DEVNET, + networkDevnet.network, ); - const address = crypto.getAddress(keys.publicKey, CONFIGURATIONS.ARK.DEVNET.pubKeyHash); + const address = crypto.getAddress(keys.publicKey, networkDevnet.network.pubKeyHash); expect(keys.compressed).toBeTruthy(); expect(address).toBe("DDA5nM7KEqLeTtQKv5qGgcnc6dpNBKJNTS"); }); @@ -298,13 +301,13 @@ describe("crypto.js", () => { describe("validate address on different networks", () => { it("should validate MAINNET addresses", () => { - configManager.setConfig(CONFIGURATIONS.ARK.MAINNET); + configManager.setConfig(networkMainnet); expect(crypto.validateAddress("AdVSe37niA3uFUPgCgMUH2tMsHF4LpLoiX")).toBeTrue(); }); it("should validate DEVNET addresses", () => { - configManager.setConfig(CONFIGURATIONS.ARK.DEVNET); + configManager.setConfig(networkDevnet); expect(crypto.validateAddress("DARiJqhogp2Lu6bxufUFQQMuMyZbxjCydN")).toBeTrue(); }); diff --git a/packages/crypto/__tests__/crypto/hdwallet.test.ts b/packages/crypto/__tests__/crypto/hdwallet.test.ts index 3a72a7d9c3..6fba33be27 100644 --- a/packages/crypto/__tests__/crypto/hdwallet.test.ts +++ b/packages/crypto/__tests__/crypto/hdwallet.test.ts @@ -3,12 +3,12 @@ import "jest-extended"; import bip32 from "bip32"; import { crypto, HDWallet } from "../../src/crypto"; import { configManager } from "../../src/managers/config"; -import network from "../../src/networks/ark/mainnet.json"; +import { mainnet } from "../../src/networks"; const mnemonic = "sorry hawk one science reject employ museum ride into post machine attack bar seminar myself unhappy faculty differ grain fish chest bird muffin mesh"; -beforeEach(() => configManager.setConfig(network)); +beforeEach(() => configManager.setConfig(mainnet)); describe("HDWallet", () => { describe("bip32", () => { diff --git a/packages/crypto/__tests__/crypto/slots.test.ts b/packages/crypto/__tests__/crypto/slots.test.ts index 46bb407dd9..6ce829c9b2 100644 --- a/packages/crypto/__tests__/crypto/slots.test.ts +++ b/packages/crypto/__tests__/crypto/slots.test.ts @@ -2,9 +2,9 @@ import "jest-extended"; import { slots } from "../../src/crypto/slots"; import { configManager } from "../../src/managers/config"; -import network from "../../src/networks/ark/devnet.json"; +import { devnet } from "../../src/networks"; -beforeEach(() => configManager.setConfig(network)); +beforeEach(() => configManager.setConfig(devnet)); describe("Slots", () => { describe("getHeight", () => { @@ -88,12 +88,6 @@ describe("Slots", () => { }); }); - describe("getConstant", () => { - it("returns constant", () => { - expect(slots.getConstant("epoch")).toBe("2017-03-21T13:00:00.000Z"); - }); - }); - describe("isForgingAllowed", () => { it("returns boolean", () => { expect(slots.isForgingAllowed()).toBeDefined(); diff --git a/packages/crypto/__tests__/managers/config.test.ts b/packages/crypto/__tests__/managers/config.test.ts index f777e225ca..9ec9845ebf 100644 --- a/packages/crypto/__tests__/managers/config.test.ts +++ b/packages/crypto/__tests__/managers/config.test.ts @@ -1,13 +1,11 @@ import "jest-extended"; -import { TRANSACTION_TYPES } from "../../src/constants"; +import { TransactionTypes } from "../../src/constants"; import { configManager } from "../../src/managers/config"; -import { dynamicFeeManager } from "../../src/managers/dynamic-fee"; import { feeManager } from "../../src/managers/fee"; -import network from "../../src/networks/ark/devnet.json"; -import networkMainnet from "../../src/networks/ark/mainnet.json"; +import { devnet, mainnet } from "../../src/networks"; -beforeEach(() => configManager.setConfig(network)); +beforeEach(() => configManager.setConfig(devnet)); describe("Configuration", () => { it("should be instantiated", () => { @@ -15,9 +13,12 @@ describe("Configuration", () => { }); it("should be set on runtime", () => { - configManager.setConfig(networkMainnet); + configManager.setConfig(mainnet); - expect(configManager.all()).toEqual(networkMainnet); + expect(configManager.all()).toContainAllKeys([ + ...Object.keys(mainnet.network), + ...["milestones", "exceptions"], + ]); }); it('key should be "set"', () => { @@ -30,40 +31,26 @@ describe("Configuration", () => { expect(configManager.get("nethash")).toBe("2a44f340d76ffc3df204c5f38cd355b7496c9065a1ade2ef92071436bd72e867"); }); - it("should build constants", () => { - expect(configManager.constants).toEqual(network.constants); + it("should build milestones", () => { + expect(configManager.milestones).toEqual(devnet.milestones); }); it("should build fees", () => { - const fees = network.constants[0].fees.staticFees; + const feesStatic = devnet.milestones[0].fees.staticFees; - expect(feeManager.get(TRANSACTION_TYPES.TRANSFER)).toEqual(fees.transfer); - expect(feeManager.get(TRANSACTION_TYPES.SECOND_SIGNATURE)).toEqual(fees.secondSignature); - expect(feeManager.get(TRANSACTION_TYPES.DELEGATE_REGISTRATION)).toEqual(fees.delegateRegistration); - expect(feeManager.get(TRANSACTION_TYPES.VOTE)).toEqual(fees.vote); - expect(feeManager.get(TRANSACTION_TYPES.MULTI_SIGNATURE)).toEqual(fees.multiSignature); - expect(feeManager.get(TRANSACTION_TYPES.IPFS)).toEqual(fees.ipfs); - expect(feeManager.get(TRANSACTION_TYPES.TIMELOCK_TRANSFER)).toEqual(fees.timelockTransfer); - expect(feeManager.get(TRANSACTION_TYPES.MULTI_PAYMENT)).toEqual(fees.multiPayment); - expect(feeManager.get(TRANSACTION_TYPES.DELEGATE_RESIGNATION)).toEqual(fees.delegateResignation); + expect(feeManager.get(TransactionTypes.Transfer)).toEqual(feesStatic.transfer); + expect(feeManager.get(TransactionTypes.SecondSignature)).toEqual(feesStatic.secondSignature); + expect(feeManager.get(TransactionTypes.DelegateRegistration)).toEqual(feesStatic.delegateRegistration); + expect(feeManager.get(TransactionTypes.Vote)).toEqual(feesStatic.vote); + expect(feeManager.get(TransactionTypes.MultiSignature)).toEqual(feesStatic.multiSignature); + expect(feeManager.get(TransactionTypes.Ipfs)).toEqual(feesStatic.ipfs); + expect(feeManager.get(TransactionTypes.TimelockTransfer)).toEqual(feesStatic.timelockTransfer); + expect(feeManager.get(TransactionTypes.MultiPayment)).toEqual(feesStatic.multiPayment); + expect(feeManager.get(TransactionTypes.DelegateResignation)).toEqual(feesStatic.delegateResignation); }); - it("should build dynamic fee offsets", () => { - const addonBytes = network.constants[0].fees.dynamicFees.addonBytes; - - expect(dynamicFeeManager.get(TRANSACTION_TYPES.TRANSFER)).toEqual(addonBytes.transfer); - expect(dynamicFeeManager.get(TRANSACTION_TYPES.SECOND_SIGNATURE)).toEqual(addonBytes.secondSignature); - expect(dynamicFeeManager.get(TRANSACTION_TYPES.DELEGATE_REGISTRATION)).toEqual(addonBytes.delegateRegistration); - expect(dynamicFeeManager.get(TRANSACTION_TYPES.VOTE)).toEqual(addonBytes.vote); - expect(dynamicFeeManager.get(TRANSACTION_TYPES.MULTI_SIGNATURE)).toEqual(addonBytes.multiSignature); - expect(dynamicFeeManager.get(TRANSACTION_TYPES.IPFS)).toEqual(addonBytes.ipfs); - expect(dynamicFeeManager.get(TRANSACTION_TYPES.TIMELOCK_TRANSFER)).toEqual(addonBytes.timelockTransfer); - expect(dynamicFeeManager.get(TRANSACTION_TYPES.MULTI_PAYMENT)).toEqual(addonBytes.multiPayment); - expect(dynamicFeeManager.get(TRANSACTION_TYPES.DELEGATE_RESIGNATION)).toEqual(addonBytes.delegateResignation); - }); - - it("should get constants for height", () => { - expect(configManager.getConstants(21600)).toEqual(network.constants[2]); + it("should get milestone for height", () => { + expect(configManager.getMilestone(21600)).toEqual(devnet.milestones[2]); }); it("should set the height", () => { diff --git a/packages/crypto/__tests__/managers/fee.test.ts b/packages/crypto/__tests__/managers/fee.test.ts index ede951d23d..ffb4c8236b 100644 --- a/packages/crypto/__tests__/managers/fee.test.ts +++ b/packages/crypto/__tests__/managers/fee.test.ts @@ -1,6 +1,6 @@ import "jest-extended"; -import { TRANSACTION_TYPES } from "../../src/constants"; +import { TransactionTypes } from "../../src/constants"; import { feeManager } from "../../src/managers/fee"; describe("Fee Manager", () => { @@ -9,14 +9,14 @@ describe("Fee Manager", () => { }); it("should set the fee", () => { - feeManager.set(TRANSACTION_TYPES.TRANSFER, 1); + feeManager.set(TransactionTypes.Transfer, 1); - expect(feeManager.get(TRANSACTION_TYPES.TRANSFER)).toEqual(1); + expect(feeManager.get(TransactionTypes.Transfer)).toEqual(1); }); it("should get multisignature fee (keysgroup length + 1)", () => { const transaction = { - type: TRANSACTION_TYPES.MULTI_SIGNATURE, + type: TransactionTypes.MultiSignature, asset: { multisignature: { keysgroup: [1, 2, 3], @@ -24,7 +24,7 @@ describe("Fee Manager", () => { }, }; - feeManager.set(TRANSACTION_TYPES.MULTI_SIGNATURE, 1); + feeManager.set(TransactionTypes.MultiSignature, 1); expect(feeManager.getForTransaction(transaction)).toEqual(4); }); diff --git a/packages/crypto/__tests__/managers/network.test.ts b/packages/crypto/__tests__/managers/network.test.ts index fd3228718e..e7f7ff279a 100644 --- a/packages/crypto/__tests__/managers/network.test.ts +++ b/packages/crypto/__tests__/managers/network.test.ts @@ -1,7 +1,7 @@ import "jest-extended"; import { NetworkManager } from "../../src/managers/network"; -import networkMainnet from "../../src/networks/ark/mainnet.json"; +import { mainnet } from "../../src/networks"; describe("Network Manager", () => { it("should be instantiated", () => { @@ -9,7 +9,7 @@ describe("Network Manager", () => { }); it("should find mainnet by name", () => { - const mainnet = NetworkManager.findByName("mainnet"); - expect(mainnet).toMatchObject(networkMainnet); + const actual = NetworkManager.findByName("mainnet"); + expect(actual).toMatchObject(mainnet); }); }); diff --git a/packages/crypto/__tests__/models/block.test.ts b/packages/crypto/__tests__/models/block.test.ts index 313b001afb..c8b14062ff 100644 --- a/packages/crypto/__tests__/models/block.test.ts +++ b/packages/crypto/__tests__/models/block.test.ts @@ -1,12 +1,12 @@ import "jest-extended"; import ByteBuffer from "bytebuffer"; -import { CONFIGURATIONS } from "../../src/constants"; +import { configManager } from "../../src"; import { Block } from "../../src/models/block"; import { Bignum } from "../../src/utils/bignum"; import { dummyBlock } from "./fixtures/block"; -const { outlookTable } = CONFIGURATIONS.ARK.MAINNET; +const { outlookTable } = configManager.getPreset("mainnet").exceptions; describe("Models - Block", () => { const data = { diff --git a/packages/crypto/__tests__/models/delegate.test.ts b/packages/crypto/__tests__/models/delegate.test.ts index 3da53a00c2..f13774c6a7 100644 --- a/packages/crypto/__tests__/models/delegate.test.ts +++ b/packages/crypto/__tests__/models/delegate.test.ts @@ -1,12 +1,10 @@ import "jest-extended"; -import bip38 from "bip38"; import { ARKTOSHI } from "../../src/constants"; -import { PrivateKey } from "../../src/identities"; import { configManager } from "../../src/managers/config"; import { Delegate } from "../../src/models/delegate"; import { Wallet } from "../../src/models/wallet"; -import { testnet } from "../../src/networks/ark"; +import { testnet } from "../../src/networks"; import { Bignum } from "../../src/utils/bignum"; import { sortTransactions } from "../../src/utils/sort-transactions"; @@ -20,7 +18,7 @@ const dummy = { describe("Models - Delegate", () => { describe("constructor", () => { it("should be ok with a plain text passphrase", () => { - const delegate = new Delegate(dummy.plainPassphrase, testnet); + const delegate = new Delegate(dummy.plainPassphrase, testnet.network); expect(delegate.publicKey).toBe(dummy.publicKey); expect(delegate.address).toBe(dummy.address); @@ -29,7 +27,7 @@ describe("Models - Delegate", () => { describe("bip38", () => { it("should pass with a valid passphrase", () => { - const delegate = new Delegate(dummy.bip38Passphrase, testnet, "bip38-password"); + const delegate = new Delegate(dummy.bip38Passphrase, testnet.network, "bip38-password"); expect(delegate.publicKey).toBe(dummy.publicKey); expect(delegate.address).toBe(dummy.address); @@ -37,7 +35,7 @@ describe("Models - Delegate", () => { }); it("should fail with an invalid passphrase", () => { - const delegate = new Delegate(dummy.bip38Passphrase, testnet, "invalid-password"); + const delegate = new Delegate(dummy.bip38Passphrase, testnet.network, "invalid-password"); expect(delegate.publicKey).toBeNull(); expect(delegate.address).toBeNull(); @@ -48,7 +46,7 @@ describe("Models - Delegate", () => { describe("encryptPassphrase", () => { it("should pass with valid data", () => { - const passphrase = Delegate.encryptPassphrase(dummy.plainPassphrase, testnet, "bip38-password"); + const passphrase = Delegate.encryptPassphrase(dummy.plainPassphrase, testnet.network, "bip38-password"); expect(passphrase).toBe(dummy.bip38Passphrase); }); @@ -62,21 +60,21 @@ describe("Models - Delegate", () => { describe("decryptPassphrase", () => { it("should pass with a valid password", () => { - const { publicKey } = Delegate.decryptPassphrase(dummy.bip38Passphrase, testnet, "bip38-password"); + const { publicKey } = Delegate.decryptPassphrase(dummy.bip38Passphrase, testnet.network, "bip38-password"); expect(publicKey).toBe(dummy.publicKey); }); it("should fail with an invalid password", () => { expect(() => { - Delegate.decryptPassphrase(dummy.bip38Passphrase, testnet, "invalid-password"); + Delegate.decryptPassphrase(dummy.bip38Passphrase, testnet.network, "invalid-password"); }).toThrow(); }); }); describe("encryptKeysWithOtp", () => { it("should pass with a valid OTP secret", () => { - const delegate = new Delegate(dummy.plainPassphrase, testnet); + const delegate = new Delegate(dummy.plainPassphrase, testnet.network); delegate.otpSecret = "one-time-password"; delegate.encryptKeysWithOtp(); @@ -87,7 +85,7 @@ describe("Models - Delegate", () => { }); it("should fail without an OTP secret", () => { - const delegate = new Delegate(dummy.plainPassphrase, testnet); + const delegate = new Delegate(dummy.plainPassphrase, testnet.network); delegate.otpSecret = undefined; expect(() => { @@ -98,7 +96,7 @@ describe("Models - Delegate", () => { describe("decryptKeysWithOtp", () => { it("should pass with valid data", () => { - const delegate = new Delegate(dummy.plainPassphrase, testnet); + const delegate = new Delegate(dummy.plainPassphrase, testnet.network); delegate.otpSecret = "one-time-password"; delegate.encryptKeysWithOtp(); @@ -115,7 +113,7 @@ describe("Models - Delegate", () => { }); it("should fail with missing encrypted data", () => { - const delegate = new Delegate(dummy.plainPassphrase, testnet); + const delegate = new Delegate(dummy.plainPassphrase, testnet.network); expect(() => { delegate.decryptKeysWithOtp(); @@ -123,7 +121,7 @@ describe("Models - Delegate", () => { }); it("should fail with invalid encrypted data", () => { - const delegate = new Delegate(dummy.plainPassphrase, testnet); + const delegate = new Delegate(dummy.plainPassphrase, testnet.network); delegate.otpSecret = "one-time-password"; delegate.encryptKeysWithOtp(); diff --git a/packages/crypto/__tests__/models/transaction.test.ts b/packages/crypto/__tests__/models/transaction.test.ts index 6fdeb43477..0e81199cb8 100644 --- a/packages/crypto/__tests__/models/transaction.test.ts +++ b/packages/crypto/__tests__/models/transaction.test.ts @@ -6,7 +6,7 @@ import { configManager } from "../../src/managers/config"; import { Transaction } from "../../src/models/transaction"; import { transaction as transactionData } from "./fixtures/transaction"; -import network from "../../src/networks/ark/devnet.json"; +import { devnet } from "../../src/networks"; const createRandomTx = type => { let transaction; @@ -88,7 +88,7 @@ const createRandomTx = type => { }; describe("Models - Transaction", () => { - beforeEach(() => configManager.setConfig(network)); + beforeEach(() => configManager.setConfig(devnet)); describe("static fromBytes", () => { it("should verify all transactions", () => { diff --git a/packages/crypto/__tests__/models/wallet.test.ts b/packages/crypto/__tests__/models/wallet.test.ts index e083d32489..ad7a55c624 100644 --- a/packages/crypto/__tests__/models/wallet.test.ts +++ b/packages/crypto/__tests__/models/wallet.test.ts @@ -5,11 +5,11 @@ import { configManager } from "../../src/managers/config"; import { Wallet } from "../../src/models/wallet"; import { Bignum } from "../../src/utils/bignum"; -import network from "../../src/networks/ark/devnet.json"; +import { devnet } from "../../src/networks"; import { multiTransaction } from "./fixtures/multi-transaction"; describe("Models - Wallet", () => { - beforeEach(() => configManager.setConfig(network)); + beforeEach(() => configManager.setConfig(devnet)); describe("toString", () => { // TODO implementation is right? diff --git a/packages/crypto/package.json b/packages/crypto/package.json index b881721a10..bad287e39b 100644 --- a/packages/crypto/package.json +++ b/packages/crypto/package.json @@ -42,6 +42,7 @@ "@types/lodash.camelcase": "^4.3.4", "@types/lodash.clonedeepwith": "^4.5.4", "@types/lodash.get": "^4.4.4", + "@types/lodash.set": "^4.3.4", "@types/lodash.sumby": "^4.6.4", "@types/otplib": "^7.0.0", "@types/pluralize": "^0.0.29", @@ -60,6 +61,7 @@ "lodash.camelcase": "^4.3.0", "lodash.clonedeepwith": "^4.5.0", "lodash.get": "^4.4.2", + "lodash.set": "^4.3.2", "lodash.sumby": "^4.6.0", "node-forge": "^0.7.6", "otplib": "^10.0.1", diff --git a/packages/crypto/src/builder/transactions/delegate-registration.ts b/packages/crypto/src/builder/transactions/delegate-registration.ts index 05c02f5bb9..acb315055e 100644 --- a/packages/crypto/src/builder/transactions/delegate-registration.ts +++ b/packages/crypto/src/builder/transactions/delegate-registration.ts @@ -1,4 +1,4 @@ -import { TRANSACTION_TYPES } from "../../constants"; +import { TransactionTypes } from "../../constants"; import { crypto } from "../../crypto"; import { feeManager } from "../../managers/fee"; import { TransactionBuilder } from "./transaction"; @@ -10,8 +10,8 @@ export class DelegateRegistrationBuilder extends TransactionBuilder { constructor() { super(); - this.data.type = TRANSACTION_TYPES.DELEGATE_REGISTRATION; - this.data.fee = feeManager.get(TRANSACTION_TYPES.DELEGATE_REGISTRATION); + this.data.type = TransactionTypes.DelegateRegistration; + this.data.fee = feeManager.get(TransactionTypes.DelegateRegistration); this.data.amount = 0; this.data.recipientId = null; this.data.senderPublicKey = null; diff --git a/packages/crypto/src/builder/transactions/delegate-resignation.ts b/packages/crypto/src/builder/transactions/delegate-resignation.ts index 97cb071ae9..9bc0f69e3f 100644 --- a/packages/crypto/src/builder/transactions/delegate-resignation.ts +++ b/packages/crypto/src/builder/transactions/delegate-resignation.ts @@ -1,4 +1,4 @@ -import { TRANSACTION_TYPES } from "../../constants"; +import { TransactionTypes } from "../../constants"; import { feeManager } from "../../managers/fee"; import { TransactionBuilder } from "./transaction"; @@ -9,7 +9,7 @@ export class DelegateResignationBuilder extends TransactionBuilder { constructor() { super(); - this.data.type = TRANSACTION_TYPES.DELEGATE_RESIGNATION; - this.data.fee = feeManager.get(TRANSACTION_TYPES.DELEGATE_RESIGNATION); + this.data.type = TransactionTypes.DelegateResignation; + this.data.fee = feeManager.get(TransactionTypes.DelegateResignation); } } diff --git a/packages/crypto/src/builder/transactions/ipfs.ts b/packages/crypto/src/builder/transactions/ipfs.ts index 1eee292115..1025bac6e6 100644 --- a/packages/crypto/src/builder/transactions/ipfs.ts +++ b/packages/crypto/src/builder/transactions/ipfs.ts @@ -1,4 +1,4 @@ -import { TRANSACTION_TYPES } from "../../constants"; +import { TransactionTypes } from "../../constants"; import { feeManager } from "../../managers/fee"; import { TransactionBuilder } from "./transaction"; @@ -9,8 +9,8 @@ export class IPFSBuilder extends TransactionBuilder { constructor() { super(); - this.data.type = TRANSACTION_TYPES.IPFS; - this.data.fee = feeManager.get(TRANSACTION_TYPES.IPFS); + this.data.type = TransactionTypes.Ipfs; + this.data.fee = feeManager.get(TransactionTypes.Ipfs); this.data.amount = 0; this.data.vendorFieldHex = null; this.data.senderPublicKey = null; diff --git a/packages/crypto/src/builder/transactions/multi-payment.ts b/packages/crypto/src/builder/transactions/multi-payment.ts index f6e13e74af..5903d1b510 100644 --- a/packages/crypto/src/builder/transactions/multi-payment.ts +++ b/packages/crypto/src/builder/transactions/multi-payment.ts @@ -1,4 +1,4 @@ -import { TRANSACTION_TYPES } from "../../constants"; +import { TransactionTypes } from "../../constants"; import { feeManager } from "../../managers/fee"; import { TransactionBuilder } from "./transaction"; @@ -9,8 +9,8 @@ export class MultiPaymentBuilder extends TransactionBuilder { constructor() { super(); - this.data.type = TRANSACTION_TYPES.MULTI_PAYMENT; - this.data.fee = feeManager.get(TRANSACTION_TYPES.MULTI_PAYMENT); + this.data.type = TransactionTypes.MultiPayment; + this.data.fee = feeManager.get(TransactionTypes.MultiPayment); this.data.payments = {}; this.data.vendorFieldHex = null; } diff --git a/packages/crypto/src/builder/transactions/multi-signature.ts b/packages/crypto/src/builder/transactions/multi-signature.ts index 19dd230f84..b51124f028 100644 --- a/packages/crypto/src/builder/transactions/multi-signature.ts +++ b/packages/crypto/src/builder/transactions/multi-signature.ts @@ -1,4 +1,4 @@ -import { TRANSACTION_TYPES } from "../../constants"; +import { TransactionTypes } from "../../constants"; import { feeManager } from "../../managers/fee"; import { TransactionBuilder } from "./transaction"; @@ -9,7 +9,7 @@ export class MultiSignatureBuilder extends TransactionBuilder { constructor() { super(); - this.data.type = TRANSACTION_TYPES.MULTI_SIGNATURE; + this.data.type = TransactionTypes.MultiSignature; this.data.fee = 0; this.data.amount = 0; this.data.recipientId = null; @@ -26,7 +26,7 @@ export class MultiSignatureBuilder extends TransactionBuilder { */ public multiSignatureAsset(multiSignature) { this.data.asset.multisignature = multiSignature; - this.data.fee = (multiSignature.keysgroup.length + 1) * feeManager.get(TRANSACTION_TYPES.MULTI_SIGNATURE); + this.data.fee = (multiSignature.keysgroup.length + 1) * feeManager.get(TransactionTypes.MultiSignature); return this; } diff --git a/packages/crypto/src/builder/transactions/second-signature.ts b/packages/crypto/src/builder/transactions/second-signature.ts index 797720a147..d2d391a4ac 100644 --- a/packages/crypto/src/builder/transactions/second-signature.ts +++ b/packages/crypto/src/builder/transactions/second-signature.ts @@ -1,4 +1,4 @@ -import { TRANSACTION_TYPES } from "../../constants"; +import { TransactionTypes } from "../../constants"; import { crypto } from "../../crypto"; import { feeManager } from "../../managers/fee"; import { TransactionBuilder } from "./transaction"; @@ -10,8 +10,8 @@ export class SecondSignatureBuilder extends TransactionBuilder { constructor() { super(); - this.data.type = TRANSACTION_TYPES.SECOND_SIGNATURE; - this.data.fee = feeManager.get(TRANSACTION_TYPES.SECOND_SIGNATURE); + this.data.type = TransactionTypes.SecondSignature; + this.data.fee = feeManager.get(TransactionTypes.SecondSignature); this.data.amount = 0; this.data.recipientId = null; this.data.senderPublicKey = null; diff --git a/packages/crypto/src/builder/transactions/timelock-transfer.ts b/packages/crypto/src/builder/transactions/timelock-transfer.ts index fbbd6f7b27..251d259e19 100644 --- a/packages/crypto/src/builder/transactions/timelock-transfer.ts +++ b/packages/crypto/src/builder/transactions/timelock-transfer.ts @@ -1,4 +1,4 @@ -import { TRANSACTION_TYPES } from "../../constants"; +import { TransactionTypes } from "../../constants"; import { feeManager } from "../../managers/fee"; import { TransactionBuilder } from "./transaction"; @@ -9,8 +9,8 @@ export class TimelockTransferBuilder extends TransactionBuilder { constructor() { super(); - this.data.type = TRANSACTION_TYPES.TIMELOCK_TRANSFER; - this.data.fee = feeManager.get(TRANSACTION_TYPES.TIMELOCK_TRANSFER); + this.data.type = TransactionTypes.TimelockTransfer; + this.data.fee = feeManager.get(TransactionTypes.TimelockTransfer); this.data.amount = 0; this.data.recipientId = null; this.data.senderPublicKey = null; diff --git a/packages/crypto/src/builder/transactions/transfer.ts b/packages/crypto/src/builder/transactions/transfer.ts index f0eaa7e69b..1c9eaef510 100644 --- a/packages/crypto/src/builder/transactions/transfer.ts +++ b/packages/crypto/src/builder/transactions/transfer.ts @@ -1,4 +1,4 @@ -import { TRANSACTION_TYPES } from "../../constants"; +import { TransactionTypes } from "../../constants"; import { feeManager } from "../../managers/fee"; import { TransactionBuilder } from "./transaction"; @@ -9,8 +9,8 @@ export class TransferBuilder extends TransactionBuilder { constructor() { super(); - this.data.type = TRANSACTION_TYPES.TRANSFER; - this.data.fee = feeManager.get(TRANSACTION_TYPES.TRANSFER); + this.data.type = TransactionTypes.Transfer; + this.data.fee = feeManager.get(TransactionTypes.Transfer); this.data.amount = 0; this.data.recipientId = null; this.data.senderPublicKey = null; diff --git a/packages/crypto/src/builder/transactions/vote.ts b/packages/crypto/src/builder/transactions/vote.ts index 1f4a539fb9..cc011d1128 100644 --- a/packages/crypto/src/builder/transactions/vote.ts +++ b/packages/crypto/src/builder/transactions/vote.ts @@ -1,4 +1,4 @@ -import { TRANSACTION_TYPES } from "../../constants"; +import { TransactionTypes } from "../../constants"; import { feeManager } from "../../managers/fee"; import { TransactionBuilder } from "./transaction"; @@ -9,8 +9,8 @@ export class VoteBuilder extends TransactionBuilder { constructor() { super(); - this.data.type = TRANSACTION_TYPES.VOTE; - this.data.fee = feeManager.get(TRANSACTION_TYPES.VOTE); + this.data.type = TransactionTypes.Vote; + this.data.fee = feeManager.get(TransactionTypes.Vote); this.data.amount = 0; this.data.recipientId = null; this.data.senderPublicKey = null; diff --git a/packages/crypto/src/constants.ts b/packages/crypto/src/constants.ts index 953c39604c..8d8883ae00 100644 --- a/packages/crypto/src/constants.ts +++ b/packages/crypto/src/constants.ts @@ -1,7 +1,3 @@ -import configDevnet from "./networks/ark/devnet.json"; -import configMainnet from "./networks/ark/mainnet.json"; -import configTestnet from "./networks/ark/testnet.json"; - /** * The Arktoshi base. * @type {Number} @@ -12,50 +8,15 @@ export const ARKTOSHI = 1e8; * Available transaction types. * @type {Object} */ -export const TRANSACTION_TYPES = Object.freeze({ - TRANSFER: 0, - SECOND_SIGNATURE: 1, - DELEGATE_REGISTRATION: 2, - VOTE: 3, - MULTI_SIGNATURE: 4, - IPFS: 5, - TIMELOCK_TRANSFER: 6, - MULTI_PAYMENT: 7, - DELEGATE_RESIGNATION: 8, - toString(type) { - switch (type) { - case this.TRANSFER: - return "transfer"; - case this.SECOND_SIGNATURE: - return "second signature"; - case this.DELEGATE_REGISTRATION: - return "delegate registration"; - case this.VOTE: - return "vote"; - case this.MULTI_SIGNATURE: - return "multi signature"; - case this.IPFS: - return "ipfs"; - case this.TIMELOCK_TRANSFER: - return "timelock transfer"; - case this.MULTI_PAYMENT: - return "multi payment"; - case this.DELEGATE_RESIGNATION: - return "delegate resignation"; - default: - throw new Error("Invalid transaction type"); - } - }, -}); -/** - * Available network configurations. - * @type {Object} - */ -export const CONFIGURATIONS = Object.freeze({ - ARK: { - MAINNET: configMainnet, - DEVNET: configDevnet, - TESTNET: configTestnet, - }, -}); +export enum TransactionTypes { + Transfer = 0, + SecondSignature = 1, + DelegateRegistration = 2, + Vote = 3, + MultiSignature = 4, + Ipfs = 5, + TimelockTransfer = 6, + MultiPayment = 7, + DelegateResignation = 8, +} diff --git a/packages/crypto/src/crypto/crypto.ts b/packages/crypto/src/crypto/crypto.ts index 874e372883..7dc1a7c9f7 100644 --- a/packages/crypto/src/crypto/crypto.ts +++ b/packages/crypto/src/crypto/crypto.ts @@ -6,13 +6,12 @@ import crypto from "crypto"; import secp256k1 from "secp256k1"; import wif from "wif"; -import { CONFIGURATIONS } from "../constants"; import { configManager } from "../managers/config"; import { feeManager } from "../managers/fee"; import { Bignum } from "../utils"; import { HashAlgorithms } from "./hash-algorithms"; -const { transactionIdFixTable } = CONFIGURATIONS.ARK.MAINNET; +const { transactionIdFixTable } = configManager.getPreset("mainnet").exceptions; class Crypto { /** diff --git a/packages/crypto/src/crypto/slots.ts b/packages/crypto/src/crypto/slots.ts index 8d670c1286..1282683d05 100644 --- a/packages/crypto/src/crypto/slots.ts +++ b/packages/crypto/src/crypto/slots.ts @@ -55,7 +55,7 @@ class Slots { * @return {Moment} */ public beginEpochTime() { - return dayjs(this.getConstant("epoch")).utc(); + return dayjs(this.getMilestone("epoch")).utc(); } /** @@ -92,7 +92,7 @@ class Slots { epochTime = this.getTime(); } - return Math.floor(epochTime / this.getConstant("blocktime")); + return Math.floor(epochTime / this.getMilestone("blocktime")); } /** @@ -101,7 +101,7 @@ class Slots { * @return {Number} */ public getSlotTime(slot) { - return slot * this.getConstant("blocktime"); + return slot * this.getMilestone("blocktime"); } /** @@ -118,16 +118,7 @@ class Slots { * @return {Number} */ public getLastSlot(nextSlot) { - return nextSlot + this.getConstant("activeDelegates"); - } - - /** - * Get constant from height 1. - * @param {String} key - * @return {*} - */ - public getConstant(key) { - return configManager.getConstants(this.height)[key]; + return nextSlot + this.getMilestone("activeDelegates"); } /** @@ -140,10 +131,19 @@ class Slots { epochTime = this.getTime(); } - const blockTime = this.getConstant("blocktime"); + const blockTime = this.getMilestone("blocktime"); return epochTime % blockTime < blockTime / 2; } + + /** + * Get constant from height 1. + * @param {String} key + * @return {*} + */ + private getMilestone(key) { + return configManager.getMilestone(this.height)[key]; + } } const slots = new Slots(); diff --git a/packages/crypto/src/handlers/transactions/index.ts b/packages/crypto/src/handlers/transactions/index.ts index 2cab8a9641..2e15e79368 100644 --- a/packages/crypto/src/handlers/transactions/index.ts +++ b/packages/crypto/src/handlers/transactions/index.ts @@ -1,4 +1,4 @@ -import { TRANSACTION_TYPES } from "../../constants"; +import { TransactionTypes } from "../../constants"; import { DelegateRegistrationHandler } from "./delegate-registration"; import { DelegateResignationHandler } from "./delegate-resignation"; @@ -17,15 +17,15 @@ export class TransactionHandler { */ constructor() { this.handlers = { - [TRANSACTION_TYPES.TRANSFER]: TransferHandler, - [TRANSACTION_TYPES.SECOND_SIGNATURE]: SecondSignatureHandler, - [TRANSACTION_TYPES.DELEGATE_REGISTRATION]: DelegateRegistrationHandler, - [TRANSACTION_TYPES.VOTE]: VoteHandler, - [TRANSACTION_TYPES.MULTI_SIGNATURE]: MultiSignatureHandler, - [TRANSACTION_TYPES.IPFS]: IpfsHandler, - [TRANSACTION_TYPES.TIMELOCK_TRANSFER]: TimelockTransferHandler, - [TRANSACTION_TYPES.MULTI_PAYMENT]: MultiPaymentHandler, - [TRANSACTION_TYPES.DELEGATE_RESIGNATION]: DelegateResignationHandler, + [TransactionTypes.Transfer]: TransferHandler, + [TransactionTypes.SecondSignature]: SecondSignatureHandler, + [TransactionTypes.DelegateRegistration]: DelegateRegistrationHandler, + [TransactionTypes.Vote]: VoteHandler, + [TransactionTypes.MultiSignature]: MultiSignatureHandler, + [TransactionTypes.Ipfs]: IpfsHandler, + [TransactionTypes.TimelockTransfer]: TimelockTransferHandler, + [TransactionTypes.MultiPayment]: MultiPaymentHandler, + [TransactionTypes.DelegateResignation]: DelegateResignationHandler, }; } diff --git a/packages/crypto/src/managers/config.ts b/packages/crypto/src/managers/config.ts index 2942229a45..6da65fddd2 100644 --- a/packages/crypto/src/managers/config.ts +++ b/packages/crypto/src/managers/config.ts @@ -1,22 +1,23 @@ import deepmerge from "deepmerge"; import camelCase from "lodash/camelCase"; -import { dynamicFeeManager } from "./dynamic-fee"; +import get from "lodash/get"; +import set from "lodash/set"; import { feeManager } from "./fee"; -import { CONFIGURATIONS, TRANSACTION_TYPES } from "../constants"; -import defaultConfig from "../networks/ark/devnet.json"; +import { TransactionTypes } from "../constants"; +import * as networks from "../networks"; export class ConfigManager { public config: any; public height: any; - public constant: any; - public constants: any; + public milestone: any; + public milestones: any; /** * @constructor */ constructor() { - this.setConfig(defaultConfig); + this.setConfig(networks.devnet); } /** @@ -26,22 +27,33 @@ export class ConfigManager { public setConfig(config) { this.config = {}; - for (const [key, value] of Object.entries(config)) { + // Map the config.network values to the root + for (const [key, value] of Object.entries(config.network)) { this.config[key] = value; } + this.config.exceptions = config.exceptions; + this.config.milestones = config.milestones; + this.buildConstants(); this.buildFees(); - this.buildAddonBytes(); } /** - * Get config from preset configurations. - * @param {String} coin + * Set the configuration based on a preset. * @param {String} network */ - public setFromPreset(coin, network) { - this.setConfig(CONFIGURATIONS[coin.toUpperCase()][network.toUpperCase()]); + public setFromPreset(network: string) { + this.setConfig(this.getPreset(network)); + } + + /** + * Get the configuration for a preset. + * @param {String} network + * @return {Object} + */ + public getPreset(network: string) { + return networks[network.toLowerCase()]; } /** @@ -58,7 +70,7 @@ export class ConfigManager { * @param {*} value */ public set(key, value) { - this.config[key] = value; + set(this.config, key, value); } /** @@ -67,7 +79,7 @@ export class ConfigManager { * @return {*} */ public get(key) { - return this.config[key]; + return get(this.config, key); } /** @@ -86,21 +98,12 @@ export class ConfigManager { return this.height; } - /** - * Get specific config constant based on height 1. - * @param {String} key - * @return {*} - */ - public getConstant(key) { - return this.getConstants()[key]; - } - /** * Get all config constants based on height. * @param {(Number|undefined)} height * @return {*} */ - public getConstants(height?) { + public getMilestone(height?) { if (!height && this.height) { height = this.height; } @@ -110,62 +113,47 @@ export class ConfigManager { } while ( - this.constant.index < this.constants.length - 1 && - height >= this.constants[this.constant.index + 1].height + this.milestone.index < this.milestones.length - 1 && + height >= this.milestones[this.milestone.index + 1].height ) { - this.constant.index++; - this.constant.data = this.constants[this.constant.index]; + this.milestone.index++; + this.milestone.data = this.milestones[this.milestone.index]; } - while (height < this.constants[this.constant.index].height) { - this.constant.index--; - this.constant.data = this.constants[this.constant.index]; + while (height < this.milestones[this.milestone.index].height) { + this.milestone.index--; + this.milestone.data = this.milestones[this.milestone.index]; } - return this.constant.data; + return this.milestone.data; } /** * Build constant data based on active heights. */ - public buildConstants() { - this.constants = this.config.constants.sort((a, b) => a.height - b.height); - this.constant = { + private buildConstants() { + this.milestones = this.config.milestones.sort((a, b) => a.height - b.height); + this.milestone = { index: 0, - data: this.constants[0], + data: this.milestones[0], }; - let lastmerged = 0; + let lastMerged = 0; - while (lastmerged < this.constants.length - 1) { - this.constants[lastmerged + 1] = deepmerge(this.constants[lastmerged], this.constants[lastmerged + 1]); - lastmerged++; + while (lastMerged < this.milestones.length - 1) { + this.milestones[lastMerged + 1] = deepmerge(this.milestones[lastMerged], this.milestones[lastMerged + 1]); + lastMerged++; } } /** * Build fees from config constants. */ - public buildFees() { - Object.keys(TRANSACTION_TYPES).forEach(type => - feeManager.set(TRANSACTION_TYPES[type], this.getConstant("fees").staticFees[camelCase(type)]), - ); - } - - /** - * Build addon bytes from config constants. - */ - public buildAddonBytes() { - if (this.getConstant("fees").dynamicFees.addonBytes) { - Object.keys(TRANSACTION_TYPES).forEach(type => - dynamicFeeManager.set( - TRANSACTION_TYPES[type], - this.getConstant("fees").dynamicFees.addonBytes[camelCase(type)], - ), - ); + private buildFees() { + for (const type of Object.keys(TransactionTypes)) { + feeManager.set(TransactionTypes[type], this.getMilestone().fees.staticFees[camelCase(type)]); } } } -const configManager = new ConfigManager(); -export { configManager }; +export const configManager = new ConfigManager(); diff --git a/packages/crypto/src/managers/dynamic-fee.ts b/packages/crypto/src/managers/dynamic-fee.ts deleted file mode 100644 index 4ce459961a..0000000000 --- a/packages/crypto/src/managers/dynamic-fee.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { TRANSACTION_TYPES } from "../constants"; - -class DynamicFeeManager { - public offsets: {}; - /** - * @constructor - */ - constructor() { - this.offsets = {}; - } - - /** - * Calculate minimum fee of a transaction for entering the pool. - * @param {Number} Minimum fee ARKTOSHI/byte - * @param {Transaction} Transaction for which we calculate the fee - * @returns {Number} Calculated minimum acceptable fee in ARKTOSHI - */ - public calculateFee(arktoshiPerByte, transaction) { - if (arktoshiPerByte <= 0) { - arktoshiPerByte = 1; - } - - // serialized is in hex - const transactionSizeInBytes = transaction.serialized.length / 2; - - return (this.get(transaction.type) + transactionSizeInBytes) * arktoshiPerByte; - } - - /** - * Get offsset value based on transaction. - * @param {Number} type - * @return {Number} - */ - public get(type) { - return this.offsets[type]; - } - - /** - * Set offset value based on type. - * @param {Number} type - * @param {Number} value - */ - public set(type, value) { - if (!this.__validType(type)) { - throw new Error("Invalid transaction type."); - } - - this.offsets[type] = value; - } - - /** - * Ensure transaction type is valid. - * @param {Number} type - * @return {Boolean} - */ - public __validType(type) { - return Object.values(TRANSACTION_TYPES).indexOf(type) > -1; - } -} - -const dynamicFeeManager = new DynamicFeeManager(); -export { dynamicFeeManager }; diff --git a/packages/crypto/src/managers/fee.ts b/packages/crypto/src/managers/fee.ts index 1fd379da03..c3cc5d00fb 100644 --- a/packages/crypto/src/managers/fee.ts +++ b/packages/crypto/src/managers/fee.ts @@ -1,4 +1,4 @@ -import { TRANSACTION_TYPES } from "../constants"; +import { TransactionTypes } from "../constants"; export class FeeManager { public fees: {}; @@ -37,7 +37,7 @@ export class FeeManager { * @return {Number} */ public getForTransaction(transaction) { - if (transaction.type === TRANSACTION_TYPES.MULTI_SIGNATURE) { + if (transaction.type === TransactionTypes.MultiSignature) { return this.fees[transaction.type] * (transaction.asset.multisignature.keysgroup.length + 1); } @@ -50,9 +50,8 @@ export class FeeManager { * @return {Boolean} */ public __validType(type) { - return Object.values(TRANSACTION_TYPES).indexOf(type) > -1; + return Object.values(TransactionTypes).indexOf(type) > -1; } } -const feeManager = new FeeManager(); -export { feeManager }; +export const feeManager = new FeeManager(); diff --git a/packages/crypto/src/managers/index.ts b/packages/crypto/src/managers/index.ts index 7de8652d34..7345bebea4 100644 --- a/packages/crypto/src/managers/index.ts +++ b/packages/crypto/src/managers/index.ts @@ -1,6 +1,5 @@ import { configManager } from "./config"; -import { dynamicFeeManager } from "./dynamic-fee"; import { feeManager } from "./fee"; import { NetworkManager } from "./network"; -export { configManager, dynamicFeeManager, feeManager, NetworkManager }; +export { configManager, feeManager, NetworkManager }; diff --git a/packages/crypto/src/managers/network.ts b/packages/crypto/src/managers/network.ts index 9655341d84..1ce5e764e3 100644 --- a/packages/crypto/src/managers/network.ts +++ b/packages/crypto/src/managers/network.ts @@ -16,7 +16,7 @@ export class NetworkManager { * @param {String} [token=ark] * @return {Object} */ - public static findByName(name, token = "ark") { - return get(networks, `${token.toLowerCase()}.${name}`); + public static findByName(name) { + return get(networks, name.toLowerCase()); } } diff --git a/packages/crypto/src/models/block.ts b/packages/crypto/src/models/block.ts index 87d286f569..30162e1dd5 100644 --- a/packages/crypto/src/models/block.ts +++ b/packages/crypto/src/models/block.ts @@ -2,13 +2,12 @@ import ByteBuffer from "bytebuffer"; import { createHash } from "crypto"; import cloneDeepWith from "lodash/cloneDeepWith"; import pluralize from "pluralize"; -import { CONFIGURATIONS } from "../constants"; import { crypto, slots } from "../crypto"; import { configManager } from "../managers/config"; import { Bignum } from "../utils"; import { Transaction } from "./transaction"; -const { outlookTable } = CONFIGURATIONS.ARK.MAINNET; +const { outlookTable } = configManager.getPreset("mainnet").exceptions; const toBytesHex = data => { const temp = data ? new Bignum(data).toString(16) : ""; @@ -431,7 +430,7 @@ export class Block { }; try { - const constants = configManager.getConstants(block.height); + const constants = configManager.getMilestone(block.height); // let previousBlock = null diff --git a/packages/crypto/src/models/delegate.ts b/packages/crypto/src/models/delegate.ts index 8b3e1b2082..2c4cc2284c 100644 --- a/packages/crypto/src/models/delegate.ts +++ b/packages/crypto/src/models/delegate.ts @@ -27,7 +27,7 @@ export class Delegate { /** * BIP38 encrypt passphrase. * @param {String} passphrase - * @param {Number} network + * @param {Object} network * @param {String} password * @return {String} * @static diff --git a/packages/crypto/src/models/transaction.ts b/packages/crypto/src/models/transaction.ts index 4f92d51f04..3a5b5914f2 100644 --- a/packages/crypto/src/models/transaction.ts +++ b/packages/crypto/src/models/transaction.ts @@ -3,12 +3,12 @@ import bs58check from "bs58check"; import ByteBuffer from "bytebuffer"; import { createHash } from "crypto"; -import { CONFIGURATIONS, TRANSACTION_TYPES } from "../constants"; +import { TransactionTypes } from "../constants"; import { crypto } from "../crypto/crypto"; import { configManager } from "../managers/config"; import { Bignum } from "../utils"; -const { transactionIdFixTable } = CONFIGURATIONS.ARK.MAINNET; +const { transactionIdFixTable } = configManager.getPreset("mainnet").exceptions; /** * TODO copy some parts to ArkDocs @@ -41,7 +41,7 @@ export class Transaction { deserialized.signSignature = deserialized.secondSignature; } - if (deserialized.type === TRANSACTION_TYPES.VOTE) { + if (deserialized.type === TransactionTypes.Vote) { deserialized.recipientId = crypto.getAddress(deserialized.senderPublicKey, deserialized.network); } @@ -49,13 +49,13 @@ export class Transaction { deserialized.vendorField = Buffer.from(deserialized.vendorFieldHex, "hex").toString("utf8"); } - if (deserialized.type === TRANSACTION_TYPES.MULTI_SIGNATURE) { + if (deserialized.type === TransactionTypes.MultiSignature) { deserialized.asset.multisignature.keysgroup = deserialized.asset.multisignature.keysgroup.map(k => `+${k}`); } if ( - deserialized.type === TRANSACTION_TYPES.SECOND_SIGNATURE || - deserialized.type === TRANSACTION_TYPES.MULTI_SIGNATURE + deserialized.type === TransactionTypes.SecondSignature || + deserialized.type === TransactionTypes.MultiSignature ) { deserialized.recipientId = crypto.getAddress(deserialized.senderPublicKey, deserialized.network); } @@ -107,23 +107,23 @@ export class Transaction { bb.writeByte(0x00); } - if (transaction.type === TRANSACTION_TYPES.TRANSFER) { + if (transaction.type === TransactionTypes.Transfer) { bb.writeUInt64(+new Bignum(transaction.amount).toFixed()); bb.writeUInt32(transaction.expiration || 0); bb.append(bs58check.decode(transaction.recipientId)); - } else if (transaction.type === TRANSACTION_TYPES.VOTE) { + } else if (transaction.type === TransactionTypes.Vote) { const voteBytes = transaction.asset.votes .map(vote => (vote[0] === "+" ? "01" : "00") + vote.slice(1)) .join(""); bb.writeByte(transaction.asset.votes.length); bb.append(voteBytes, "hex"); - } else if (transaction.type === TRANSACTION_TYPES.SECOND_SIGNATURE) { + } else if (transaction.type === TransactionTypes.SecondSignature) { bb.append(transaction.asset.signature.publicKey, "hex"); - } else if (transaction.type === TRANSACTION_TYPES.DELEGATE_REGISTRATION) { + } else if (transaction.type === TransactionTypes.DelegateRegistration) { const delegateBytes = Buffer.from(transaction.asset.delegate.username, "utf8"); bb.writeByte(delegateBytes.length); bb.append(delegateBytes, "hex"); - } else if (transaction.type === TRANSACTION_TYPES.MULTI_SIGNATURE) { + } else if (transaction.type === TransactionTypes.MultiSignature) { let joined = null; if (!transaction.version || transaction.version === 1) { @@ -137,21 +137,21 @@ export class Transaction { bb.writeByte(transaction.asset.multisignature.keysgroup.length); bb.writeByte(transaction.asset.multisignature.lifetime); bb.append(keysgroupBuffer, "hex"); - } else if (transaction.type === TRANSACTION_TYPES.IPFS) { + } else if (transaction.type === TransactionTypes.Ipfs) { bb.writeByte(transaction.asset.ipfs.dag.length / 2); bb.append(transaction.asset.ipfs.dag, "hex"); - } else if (transaction.type === TRANSACTION_TYPES.TIMELOCK_TRANSFER) { + } else if (transaction.type === TransactionTypes.TimelockTransfer) { bb.writeUInt64(+transaction.amount.toFixed()); bb.writeByte(transaction.timelockType); bb.writeUInt32(transaction.timelock); bb.append(bs58check.decode(transaction.recipientId)); - } else if (transaction.type === TRANSACTION_TYPES.MULTI_PAYMENT) { + } else if (transaction.type === TransactionTypes.MultiPayment) { bb.writeUInt32(transaction.asset.payments.length); transaction.asset.payments.forEach(p => { bb.writeUInt64(p.amount); bb.append(bs58check.decode(p.recipientId)); }); - } else if (transaction.type === TRANSACTION_TYPES.DELEGATE_RESIGNATION) { + } else if (transaction.type === TransactionTypes.DelegateResignation) { // delegate resignation - empty payload } @@ -192,7 +192,7 @@ export class Transaction { const assetOffset = (41 + 8 + 1) * 2 + vflength * 2; - if (transaction.type === TRANSACTION_TYPES.TRANSFER) { + if (transaction.type === TransactionTypes.Transfer) { transaction.amount = new Bignum(buf.readUInt64(assetOffset / 2)); transaction.expiration = buf.readUInt32(assetOffset / 2 + 8); transaction.recipientId = bs58check.encode( @@ -202,7 +202,7 @@ export class Transaction { Transaction.parseSignatures(hexString, transaction, assetOffset + (21 + 12) * 2); } - if (transaction.type === TRANSACTION_TYPES.VOTE) { + if (transaction.type === TransactionTypes.Vote) { const votelength = buf.readInt8(assetOffset / 2) & 0xff; transaction.asset = { votes: [] }; @@ -216,7 +216,7 @@ export class Transaction { Transaction.parseSignatures(hexString, transaction, assetOffset + 2 + votelength * 34 * 2); } - if (transaction.type === TRANSACTION_TYPES.SECOND_SIGNATURE) { + if (transaction.type === TransactionTypes.SecondSignature) { transaction.asset = { signature: { publicKey: hexString.substring(assetOffset, assetOffset + 66), @@ -226,7 +226,7 @@ export class Transaction { Transaction.parseSignatures(hexString, transaction, assetOffset + 66); } - if (transaction.type === TRANSACTION_TYPES.DELEGATE_REGISTRATION) { + if (transaction.type === TransactionTypes.DelegateRegistration) { const usernamelength = buf.readInt8(assetOffset / 2) & 0xff; transaction.asset = { @@ -238,7 +238,7 @@ export class Transaction { Transaction.parseSignatures(hexString, transaction, assetOffset + (usernamelength + 1) * 2); } - if (transaction.type === TRANSACTION_TYPES.MULTI_SIGNATURE) { + if (transaction.type === TransactionTypes.MultiSignature) { transaction.asset = { multisignature: { keysgroup: [] } }; transaction.asset.multisignature.min = buf.readInt8(assetOffset / 2) & 0xff; @@ -252,7 +252,7 @@ export class Transaction { Transaction.parseSignatures(hexString, transaction, assetOffset + 6 + num * 66); } - if (transaction.type === TRANSACTION_TYPES.IPFS) { + if (transaction.type === TransactionTypes.Ipfs) { transaction.asset = {}; const l = buf.readInt8(assetOffset / 2) & 0xff; @@ -260,7 +260,7 @@ export class Transaction { Transaction.parseSignatures(hexString, transaction, assetOffset + 2 + l * 2); } - if (transaction.type === TRANSACTION_TYPES.TIMELOCK_TRANSFER) { + if (transaction.type === TransactionTypes.TimelockTransfer) { transaction.amount = new Bignum(buf.readUInt64(assetOffset / 2)); transaction.timelockType = buf.readInt8(assetOffset / 2 + 8) & 0xff; transaction.timelock = buf.readUInt64(assetOffset / 2 + 9).toNumber(); @@ -271,7 +271,7 @@ export class Transaction { Transaction.parseSignatures(hexString, transaction, assetOffset + (21 + 13) * 2); } - if (transaction.type === TRANSACTION_TYPES.MULTI_PAYMENT) { + if (transaction.type === TransactionTypes.MultiPayment) { transaction.asset = { payments: [] }; const total = buf.readInt8(assetOffset / 2) & 0xff; @@ -290,7 +290,7 @@ export class Transaction { Transaction.parseSignatures(hexString, transaction, offset * 2); } - if (transaction.type === TRANSACTION_TYPES.DELEGATE_RESIGNATION) { + if (transaction.type === TransactionTypes.DelegateResignation) { Transaction.parseSignatures(hexString, transaction, assetOffset); } diff --git a/packages/crypto/src/models/wallet.ts b/packages/crypto/src/models/wallet.ts index a83c2e386d..6fe11bfbc3 100644 --- a/packages/crypto/src/models/wallet.ts +++ b/packages/crypto/src/models/wallet.ts @@ -1,4 +1,4 @@ -import { TRANSACTION_TYPES } from "../constants"; +import { TransactionTypes } from "../constants"; import { crypto } from "../crypto/crypto"; import { transactionHandler } from "../handlers/transactions"; import { configManager } from "../managers/config"; @@ -247,26 +247,26 @@ export class Wallet { } } - if (transaction.type === TRANSACTION_TYPES.TRANSFER) { + if (transaction.type === TransactionTypes.Transfer) { audit.push({ Transfer: true }); } - if (transaction.type === TRANSACTION_TYPES.SECOND_SIGNATURE) { + if (transaction.type === TransactionTypes.SecondSignature) { audit.push({ "Second public key": this.secondPublicKey }); } - if (transaction.type === TRANSACTION_TYPES.DELEGATE_REGISTRATION) { + if (transaction.type === TransactionTypes.DelegateRegistration) { const username = transaction.asset.delegate.username; audit.push({ "Current username": this.username }); audit.push({ "New username": username }); } - if (transaction.type === TRANSACTION_TYPES.VOTE) { + if (transaction.type === TransactionTypes.Vote) { audit.push({ "Current vote": this.vote }); audit.push({ "New vote": transaction.asset.votes[0] }); } - if (transaction.type === TRANSACTION_TYPES.MULTI_SIGNATURE) { + if (transaction.type === TransactionTypes.MultiSignature) { const keysgroup = transaction.asset.multisignature.keysgroup; audit.push({ "Multisignature not yet registered": !this.multisignature }); audit.push({ @@ -280,28 +280,28 @@ export class Wallet { }); } - if (transaction.type === TRANSACTION_TYPES.IPFS) { + if (transaction.type === TransactionTypes.Ipfs) { audit.push({ IPFS: true }); } - if (transaction.type === TRANSACTION_TYPES.TIMELOCK_TRANSFER) { + if (transaction.type === TransactionTypes.TimelockTransfer) { audit.push({ Timelock: true }); } - if (transaction.type === TRANSACTION_TYPES.MULTI_PAYMENT) { + if (transaction.type === TransactionTypes.MultiPayment) { const amount = transaction.asset.payments.reduce((a, p) => a.plus(p.amount), Bignum.ZERO); audit.push({ "Multipayment remaining amount": amount }); } - if (transaction.type === TRANSACTION_TYPES.DELEGATE_RESIGNATION) { + if (transaction.type === TransactionTypes.DelegateResignation) { audit.push({ "Resignate Delegate": this.username }); } - if (transaction.type === TRANSACTION_TYPES.DELEGATE_RESIGNATION) { + if (transaction.type === TransactionTypes.DelegateResignation) { audit.push({ "Resignate Delegate": this.username }); } - if (!Object.values(TRANSACTION_TYPES).includes(transaction.type)) { + if (!Object.values(TransactionTypes).includes(transaction.type)) { audit.push({ "Unknown Type": true }); } diff --git a/packages/crypto/src/networks/ark/bitcoin.json b/packages/crypto/src/networks/ark/bitcoin.json deleted file mode 100644 index 0625e01320..0000000000 --- a/packages/crypto/src/networks/ark/bitcoin.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "name": "bitcoin", - "messagePrefix": "\u0018Bitcoin Signed Message:\n", - "bip32": { - "public": 76067358, - "private": 76066276 - }, - "pubKeyHash": 0, - "wif": 128 -} diff --git a/packages/crypto/src/networks/ark/devnet.json b/packages/crypto/src/networks/ark/devnet.json deleted file mode 100644 index 773917a2e1..0000000000 --- a/packages/crypto/src/networks/ark/devnet.json +++ /dev/null @@ -1,94 +0,0 @@ -{ - "name": "devnet", - "messagePrefix": "DARK message:\n", - "bip32": { - "public": 46090600, - "private": 46089520 - }, - "pubKeyHash": 30, - "nethash": "2a44f340d76ffc3df204c5f38cd355b7496c9065a1ade2ef92071436bd72e867", - "wif": 170, - "aip20": 1, - "client": { - "token": "DARK", - "symbol": "DѦ", - "explorer": "https://dexplorer.ark.io" - }, - "constants": [ - { - "height": 1, - "reward": 0, - "activeDelegates": 51, - "blocktime": 8, - "block": { - "version": 0, - "maxTransactions": 50, - "maxPayload": 2097152 - }, - "epoch": "2017-03-21T13:00:00.000Z", - "fees": { - "dynamic": true, - "dynamicFees": { - "minFeePool": 1000, - "minFeeBroadcast": 1000, - "addonBytes": { - "transfer": 100, - "secondSignature": 250, - "delegateRegistration": 400000, - "vote": 100, - "multiSignature": 500, - "ipfs": 250, - "timelockTransfer": 500, - "multiPayment": 500, - "delegateResignation": 400000 - } - }, - "staticFees": { - "transfer": 10000000, - "secondSignature": 500000000, - "delegateRegistration": 2500000000, - "vote": 100000000, - "multiSignature": 500000000, - "ipfs": 0, - "timelockTransfer": 0, - "multiPayment": 0, - "delegateResignation": 0 - } - } - }, - { - "height": 10800, - "reward": 200000000 - }, - { - "height": 21600, - "block": { - "maxTransactions": 150, - "maxPayload": 6300000 - } - }, - { - "height": 910000, - "block": { - "maxTransactions": 500, - "maxPayload": 21000000 - } - } - ], - "exceptions": { - "blocks": ["15895730198424359628", "14746174532446639362"], - "transactions": [ - "76bd168e57a4431a64617c4e7864df1e0be89831eabaa230e37643efae2def6f", - "90d06cb306dcc33faba59545e03d91ee83b0409e66a45ffe6a9e3b1049a0c521", - "0f7a3e8036fbaae7c76f7615b09b8c4f1337e96d87042d86e03cc5ab9b6ed745", - "23733214f347970a34ccd772f89396056309744688bd6dbc35129e1f12d46d2f", - "e30d7290ca9cab570aa72bf0365dde39b8d75fe65a4e804844e5708a021f8ab4", - "03d3902bb30f71c29151f8b85ff478be1dc5264785c8c84550b6b59339dc03c9", - "7a00dc347a50186bc0d789a7899f1a4dcbc1e5d5adbb5359df238cd2b9363b41", - "bbe266eac2bbc505b40e74ae6d1960d7c76d3ca8d4b942b6046f0c5f750ff9f4", - "cb63ee14068a8d2987c90ecb12998653161cd8748af7790c75592647260d3266", - "d184752c1546c366866013aa00a2a0f9b40463656072334fc302ff783ff4ee98", - "f8122e3d8b7ad31c58ed3254196b16c23249b8372f06de42191c43bfcf39849d" - ] - } -} diff --git a/packages/crypto/src/networks/ark/index.ts b/packages/crypto/src/networks/ark/index.ts deleted file mode 100644 index 6707573a3c..0000000000 --- a/packages/crypto/src/networks/ark/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -import bitcoin from "./bitcoin.json"; -import devnet from "./devnet.json"; -import mainnet from "./mainnet.json"; -import testnet from "./testnet.json"; - -export { bitcoin, devnet, mainnet, testnet }; diff --git a/packages/crypto/src/networks/ark/mainnet.json b/packages/crypto/src/networks/ark/mainnet.json deleted file mode 100644 index e193df70be..0000000000 --- a/packages/crypto/src/networks/ark/mainnet.json +++ /dev/null @@ -1,115 +0,0 @@ -{ - "name": "mainnet", - "messagePrefix": "ARK message:\n", - "bip32": { - "public": 46090600, - "private": 46089520 - }, - "pubKeyHash": 23, - "nethash": "6e84d08bd299ed97c212c886c98a57e36545c8f5d645ca7eeae63a8bd62d8988", - "wif": 170, - "aip20": 0, - "client": { - "token": "ARK", - "symbol": "Ѧ", - "explorer": "https://explorer.ark.io" - }, - "constants": [ - { - "height": 1, - "reward": 0, - "activeDelegates": 51, - "blocktime": 8, - "block": { - "version": 0, - "maxTransactions": 50, - "maxPayload": 2097152 - }, - "epoch": "2017-03-21T13:00:00.000Z", - "fees": { - "dynamic": true, - "dynamicFees": { - "minFeePool": 3000, - "minFeeBroadcast": 3000, - "addonBytes": { - "transfer": 100, - "secondSignature": 250, - "delegateRegistration": 400000, - "vote": 100, - "multiSignature": 500, - "ipfs": 250, - "timelockTransfer": 500, - "multiPayment": 500, - "delegateResignation": 400000 - } - }, - "staticFees": { - "transfer": 10000000, - "secondSignature": 500000000, - "delegateRegistration": 2500000000, - "vote": 100000000, - "multiSignature": 500000000, - "ipfs": 0, - "timelockTransfer": 0, - "multiPayment": 0, - "delegateResignation": 0 - } - } - }, - { - "height": 75600, - "reward": 200000000 - }, - { - "height": 6600000, - "block": { - "maxTransactions": 150, - "maxPayload": 6300000 - } - } - ], - "exceptions": { - "transactions": ["608c7aeba0895da4517496590896eb325a0b5d367e1b186b1c07d7651a568b9e"] - }, - "outlookTable": { - "5139199631254983076": "1000099631254983076", - "4683900276587456793": "1000000276587456793", - "4719273207090574361": "1000073207090574361", - "10008425497949974873": "10000425497949974873", - "3011426208694781338": "1000026208694781338", - "122506651077645039": "100006651077645039", - "5720847785115142568": "1000047785115142568", - "7018402152859193732": "1000002152859193732", - "12530635932931954947": "10000635932931954947", - "7061061305098280027": "1000061305098280027", - "3983271186026110297": "1000071186026110297", - "3546732630357730082": "1000032630357730082", - "14024378732446299587": "10000378732446299587", - "5160516564770509401": "1000016564770509401", - "241883250703033792": "100003250703033792", - "18238049267092652511": "10000049267092652511", - "3824223895435898486": "1000023895435898486", - "4888561739037785996": "1000061739037785996", - "1256478353465481084": "1000078353465481084", - "12598210368652133913": "10000210368652133913", - "17559226088420912749": "10000226088420912749", - "13894975866600060289": "10000975866600060289", - "11710672157782824154": "10000672157782824154", - "5509880884401609373": "1000080884401609373", - "11486353335769396593": "10000353335769396593", - "10147280738049458646": "10000280738049458646", - "5684621525438367021": "1000021525438367021", - "719490120693255848": "100000120693255848", - "7154018532147250826": "1000018532147250826", - "38016207884795383": "10000207884795383", - "8324387831264270399": "1000087831264270399", - "10123661368384267251": "10000661368384267251", - "2222163236406460530": "1000063236406460530", - "5059382813585250340": "1000082813585250340", - "7091362542116598855": "1000062542116598855", - "8225244493039935740": "1000044493039935740" - }, - "transactionIdFixTable": { - "ca764c01dd78f93393b02f7f6c4f0c12ed8e7ca26d3098e91d6e461a238a6b33": "80d75c7b90288246199e4a97ba726bad6639595ef92ad7c2bd14fd31563241ab" - } -} diff --git a/packages/crypto/src/networks/ark/testnet.json b/packages/crypto/src/networks/ark/testnet.json deleted file mode 100644 index 92b04cd230..0000000000 --- a/packages/crypto/src/networks/ark/testnet.json +++ /dev/null @@ -1,71 +0,0 @@ -{ - "name": "testnet", - "messagePrefix": "TEST message:\n", - "bip32": { - "public": 70617039, - "private": 70615956 - }, - "pubKeyHash": 23, - "nethash": "d9acd04bde4234a81addb8482333b4ac906bed7be5a9970ce8ada428bd083192", - "wif": 186, - "aip20": 0, - "client": { - "token": "TARK", - "symbol": "TѦ", - "explorer": "http://texplorer.ark.io" - }, - "constants": [ - { - "height": 1, - "reward": 0, - "activeDelegates": 51, - "blocktime": 8, - "block": { - "version": 0, - "maxTransactions": 150, - "maxPayload": 2097152 - }, - "epoch": "2017-03-21T13:00:00.000Z", - "fees": { - "dynamic": true, - "dynamicFees": { - "minFeePool": 1000, - "minFeeBroadcast": 1000, - "addonBytes": { - "transfer": 100, - "secondSignature": 250, - "delegateRegistration": 400000, - "vote": 100, - "multiSignature": 500, - "ipfs": 250, - "timelockTransfer": 500, - "multiPayment": 500, - "delegateResignation": 400000 - } - }, - "staticFees": { - "transfer": 10000000, - "secondSignature": 500000000, - "delegateRegistration": 2500000000, - "vote": 100000000, - "multiSignature": 500000000, - "ipfs": 0, - "timelockTransfer": 0, - "multiPayment": 0, - "delegateResignation": 0 - } - } - }, - { - "height": 10, - "fees": { - "dynamic": true - } - }, - { - "height": 75600, - "reward": 200000000 - } - ], - "exceptions": {} -} diff --git a/packages/crypto/src/networks/devnet/dynamicFees.json b/packages/crypto/src/networks/devnet/dynamicFees.json new file mode 100644 index 0000000000..92af028d5d --- /dev/null +++ b/packages/crypto/src/networks/devnet/dynamicFees.json @@ -0,0 +1,16 @@ +{ + "enabled": true, + "minFeePool": 1000, + "minFeeBroadcast": 1000, + "addonBytes": { + "transfer": 100, + "secondSignature": 250, + "delegateRegistration": 400000, + "vote": 100, + "multiSignature": 500, + "ipfs": 250, + "timelockTransfer": 500, + "multiPayment": 500, + "delegateResignation": 400000 + } +} diff --git a/packages/crypto/src/networks/devnet/exceptions.json b/packages/crypto/src/networks/devnet/exceptions.json new file mode 100644 index 0000000000..b186ecbacd --- /dev/null +++ b/packages/crypto/src/networks/devnet/exceptions.json @@ -0,0 +1,16 @@ +{ + "blocks": ["15895730198424359628", "14746174532446639362"], + "transactions": [ + "76bd168e57a4431a64617c4e7864df1e0be89831eabaa230e37643efae2def6f", + "90d06cb306dcc33faba59545e03d91ee83b0409e66a45ffe6a9e3b1049a0c521", + "0f7a3e8036fbaae7c76f7615b09b8c4f1337e96d87042d86e03cc5ab9b6ed745", + "23733214f347970a34ccd772f89396056309744688bd6dbc35129e1f12d46d2f", + "e30d7290ca9cab570aa72bf0365dde39b8d75fe65a4e804844e5708a021f8ab4", + "03d3902bb30f71c29151f8b85ff478be1dc5264785c8c84550b6b59339dc03c9", + "7a00dc347a50186bc0d789a7899f1a4dcbc1e5d5adbb5359df238cd2b9363b41", + "bbe266eac2bbc505b40e74ae6d1960d7c76d3ca8d4b942b6046f0c5f750ff9f4", + "cb63ee14068a8d2987c90ecb12998653161cd8748af7790c75592647260d3266", + "d184752c1546c366866013aa00a2a0f9b40463656072334fc302ff783ff4ee98", + "f8122e3d8b7ad31c58ed3254196b16c23249b8372f06de42191c43bfcf39849d" + ] +} diff --git a/packages/crypto/src/networks/devnet/index.ts b/packages/crypto/src/networks/devnet/index.ts new file mode 100644 index 0000000000..76fc792b63 --- /dev/null +++ b/packages/crypto/src/networks/devnet/index.ts @@ -0,0 +1,5 @@ +import exceptions from "./exceptions.json"; +import milestones from "./milestones.json"; +import network from "./network.json"; + +export const devnet = { exceptions, milestones, network }; diff --git a/packages/crypto/src/networks/devnet/milestones.json b/packages/crypto/src/networks/devnet/milestones.json new file mode 100644 index 0000000000..2623dbc4c1 --- /dev/null +++ b/packages/crypto/src/networks/devnet/milestones.json @@ -0,0 +1,45 @@ +[ + { + "height": 1, + "reward": 0, + "activeDelegates": 51, + "blocktime": 8, + "block": { + "version": 0, + "maxTransactions": 50, + "maxPayload": 2097152 + }, + "epoch": "2017-03-21T13:00:00.000Z", + "fees": { + "staticFees": { + "transfer": 10000000, + "secondSignature": 500000000, + "delegateRegistration": 2500000000, + "vote": 100000000, + "multiSignature": 500000000, + "ipfs": 0, + "timelockTransfer": 0, + "multiPayment": 0, + "delegateResignation": 0 + } + } + }, + { + "height": 10800, + "reward": 200000000 + }, + { + "height": 21600, + "block": { + "maxTransactions": 150, + "maxPayload": 6300000 + } + }, + { + "height": 910000, + "block": { + "maxTransactions": 500, + "maxPayload": 21000000 + } + } +] diff --git a/packages/crypto/src/networks/devnet/network.json b/packages/crypto/src/networks/devnet/network.json new file mode 100644 index 0000000000..6988d83b6a --- /dev/null +++ b/packages/crypto/src/networks/devnet/network.json @@ -0,0 +1,17 @@ +{ + "name": "devnet", + "messagePrefix": "DARK message:\n", + "bip32": { + "public": 46090600, + "private": 46089520 + }, + "pubKeyHash": 30, + "nethash": "2a44f340d76ffc3df204c5f38cd355b7496c9065a1ade2ef92071436bd72e867", + "wif": 170, + "aip20": 1, + "client": { + "token": "DARK", + "symbol": "DѦ", + "explorer": "https://dexplorer.ark.io" + } +} diff --git a/packages/crypto/src/networks/index.ts b/packages/crypto/src/networks/index.ts index c1bea7c41a..715d83f536 100644 --- a/packages/crypto/src/networks/index.ts +++ b/packages/crypto/src/networks/index.ts @@ -1,3 +1,5 @@ -import * as ark from "./ark"; +import { devnet } from "./devnet"; +import { mainnet } from "./mainnet"; +import { testnet } from "./testnet"; -export { ark }; +export { devnet, mainnet, testnet }; diff --git a/packages/crypto/src/networks/mainnet/dynamicFees.json b/packages/crypto/src/networks/mainnet/dynamicFees.json new file mode 100644 index 0000000000..173d6e4295 --- /dev/null +++ b/packages/crypto/src/networks/mainnet/dynamicFees.json @@ -0,0 +1,16 @@ +{ + "enabled": true, + "minFeePool": 3000, + "minFeeBroadcast": 3000, + "addonBytes": { + "transfer": 100, + "secondSignature": 250, + "delegateRegistration": 400000, + "vote": 100, + "multiSignature": 500, + "ipfs": 250, + "timelockTransfer": 500, + "multiPayment": 500, + "delegateResignation": 400000 + } +} diff --git a/packages/crypto/src/networks/mainnet/exceptions.json b/packages/crypto/src/networks/mainnet/exceptions.json new file mode 100644 index 0000000000..c042700d55 --- /dev/null +++ b/packages/crypto/src/networks/mainnet/exceptions.json @@ -0,0 +1,44 @@ +{ + "transactions": ["608c7aeba0895da4517496590896eb325a0b5d367e1b186b1c07d7651a568b9e"], + "outlookTable": { + "5139199631254983076": "1000099631254983076", + "4683900276587456793": "1000000276587456793", + "4719273207090574361": "1000073207090574361", + "10008425497949974873": "10000425497949974873", + "3011426208694781338": "1000026208694781338", + "122506651077645039": "100006651077645039", + "5720847785115142568": "1000047785115142568", + "7018402152859193732": "1000002152859193732", + "12530635932931954947": "10000635932931954947", + "7061061305098280027": "1000061305098280027", + "3983271186026110297": "1000071186026110297", + "3546732630357730082": "1000032630357730082", + "14024378732446299587": "10000378732446299587", + "5160516564770509401": "1000016564770509401", + "241883250703033792": "100003250703033792", + "18238049267092652511": "10000049267092652511", + "3824223895435898486": "1000023895435898486", + "4888561739037785996": "1000061739037785996", + "1256478353465481084": "1000078353465481084", + "12598210368652133913": "10000210368652133913", + "17559226088420912749": "10000226088420912749", + "13894975866600060289": "10000975866600060289", + "11710672157782824154": "10000672157782824154", + "5509880884401609373": "1000080884401609373", + "11486353335769396593": "10000353335769396593", + "10147280738049458646": "10000280738049458646", + "5684621525438367021": "1000021525438367021", + "719490120693255848": "100000120693255848", + "7154018532147250826": "1000018532147250826", + "38016207884795383": "10000207884795383", + "8324387831264270399": "1000087831264270399", + "10123661368384267251": "10000661368384267251", + "2222163236406460530": "1000063236406460530", + "5059382813585250340": "1000082813585250340", + "7091362542116598855": "1000062542116598855", + "8225244493039935740": "1000044493039935740" + }, + "transactionIdFixTable": { + "ca764c01dd78f93393b02f7f6c4f0c12ed8e7ca26d3098e91d6e461a238a6b33": "80d75c7b90288246199e4a97ba726bad6639595ef92ad7c2bd14fd31563241ab" + } +} diff --git a/packages/crypto/src/networks/mainnet/index.ts b/packages/crypto/src/networks/mainnet/index.ts new file mode 100644 index 0000000000..f880959ca5 --- /dev/null +++ b/packages/crypto/src/networks/mainnet/index.ts @@ -0,0 +1,5 @@ +import exceptions from "./exceptions.json"; +import milestones from "./milestones.json"; +import network from "./network.json"; + +export const mainnet = { exceptions, milestones, network }; diff --git a/packages/crypto/src/networks/mainnet/milestones.json b/packages/crypto/src/networks/mainnet/milestones.json new file mode 100644 index 0000000000..6154db5dee --- /dev/null +++ b/packages/crypto/src/networks/mainnet/milestones.json @@ -0,0 +1,38 @@ +[ + { + "height": 1, + "reward": 0, + "activeDelegates": 51, + "blocktime": 8, + "block": { + "version": 0, + "maxTransactions": 50, + "maxPayload": 2097152 + }, + "epoch": "2017-03-21T13:00:00.000Z", + "fees": { + "staticFees": { + "transfer": 10000000, + "secondSignature": 500000000, + "delegateRegistration": 2500000000, + "vote": 100000000, + "multiSignature": 500000000, + "ipfs": 0, + "timelockTransfer": 0, + "multiPayment": 0, + "delegateResignation": 0 + } + } + }, + { + "height": 75600, + "reward": 200000000 + }, + { + "height": 6600000, + "block": { + "maxTransactions": 150, + "maxPayload": 6300000 + } + } +] diff --git a/packages/crypto/src/networks/mainnet/network.json b/packages/crypto/src/networks/mainnet/network.json new file mode 100644 index 0000000000..6eb5620e77 --- /dev/null +++ b/packages/crypto/src/networks/mainnet/network.json @@ -0,0 +1,17 @@ +{ + "name": "mainnet", + "messagePrefix": "ARK message:\n", + "bip32": { + "public": 46090600, + "private": 46089520 + }, + "pubKeyHash": 23, + "nethash": "6e84d08bd299ed97c212c886c98a57e36545c8f5d645ca7eeae63a8bd62d8988", + "wif": 170, + "aip20": 0, + "client": { + "token": "ARK", + "symbol": "Ѧ", + "explorer": "https://explorer.ark.io" + } +} diff --git a/packages/crypto/src/networks/testnet/dynamicFees.json b/packages/crypto/src/networks/testnet/dynamicFees.json new file mode 100644 index 0000000000..92af028d5d --- /dev/null +++ b/packages/crypto/src/networks/testnet/dynamicFees.json @@ -0,0 +1,16 @@ +{ + "enabled": true, + "minFeePool": 1000, + "minFeeBroadcast": 1000, + "addonBytes": { + "transfer": 100, + "secondSignature": 250, + "delegateRegistration": 400000, + "vote": 100, + "multiSignature": 500, + "ipfs": 250, + "timelockTransfer": 500, + "multiPayment": 500, + "delegateResignation": 400000 + } +} diff --git a/packages/crypto/src/networks/testnet/exceptions.json b/packages/crypto/src/networks/testnet/exceptions.json new file mode 100644 index 0000000000..0967ef424b --- /dev/null +++ b/packages/crypto/src/networks/testnet/exceptions.json @@ -0,0 +1 @@ +{} diff --git a/packages/crypto/src/networks/testnet/index.ts b/packages/crypto/src/networks/testnet/index.ts new file mode 100644 index 0000000000..d9e83d3f0e --- /dev/null +++ b/packages/crypto/src/networks/testnet/index.ts @@ -0,0 +1,5 @@ +import exceptions from "./exceptions.json"; +import milestones from "./milestones.json"; +import network from "./network.json"; + +export const testnet = { exceptions, milestones, network }; diff --git a/packages/crypto/src/networks/testnet/milestones.json b/packages/crypto/src/networks/testnet/milestones.json new file mode 100644 index 0000000000..51c32313cf --- /dev/null +++ b/packages/crypto/src/networks/testnet/milestones.json @@ -0,0 +1,31 @@ +[ + { + "height": 1, + "reward": 0, + "activeDelegates": 51, + "blocktime": 8, + "block": { + "version": 0, + "maxTransactions": 150, + "maxPayload": 2097152 + }, + "epoch": "2017-03-21T13:00:00.000Z", + "fees": { + "staticFees": { + "transfer": 10000000, + "secondSignature": 500000000, + "delegateRegistration": 2500000000, + "vote": 100000000, + "multiSignature": 500000000, + "ipfs": 0, + "timelockTransfer": 0, + "multiPayment": 0, + "delegateResignation": 0 + } + } + }, + { + "height": 75600, + "reward": 200000000 + } +] diff --git a/packages/crypto/src/networks/testnet/network.json b/packages/crypto/src/networks/testnet/network.json new file mode 100644 index 0000000000..0f373e462e --- /dev/null +++ b/packages/crypto/src/networks/testnet/network.json @@ -0,0 +1,17 @@ +{ + "name": "testnet", + "messagePrefix": "TEST message:\n", + "bip32": { + "public": 70617039, + "private": 70615956 + }, + "pubKeyHash": 23, + "nethash": "d9acd04bde4234a81addb8482333b4ac906bed7be5a9970ce8ada428bd083192", + "wif": 186, + "aip20": 0, + "client": { + "token": "TARK", + "symbol": "TѦ", + "explorer": "http://texplorer.ark.io" + } +} diff --git a/packages/crypto/src/validation/extensions/transactions/base.ts b/packages/crypto/src/validation/extensions/transactions/base.ts index 818cbe91db..11d079284e 100644 --- a/packages/crypto/src/validation/extensions/transactions/base.ts +++ b/packages/crypto/src/validation/extensions/transactions/base.ts @@ -1,4 +1,4 @@ -import { TRANSACTION_TYPES } from "../../../constants"; +import { TransactionTypes } from "../../../constants"; export const base = joi => joi.object().keys({ diff --git a/packages/crypto/src/validation/extensions/transactions/delegate-registration.ts b/packages/crypto/src/validation/extensions/transactions/delegate-registration.ts index d0e65e7862..30b499571f 100644 --- a/packages/crypto/src/validation/extensions/transactions/delegate-registration.ts +++ b/packages/crypto/src/validation/extensions/transactions/delegate-registration.ts @@ -1,4 +1,4 @@ -import { TRANSACTION_TYPES } from "../../../constants"; +import { TransactionTypes } from "../../../constants"; import { base as transaction } from "./base"; export const delegateRegistration = joi => ({ @@ -6,7 +6,7 @@ export const delegateRegistration = joi => ({ base: transaction(joi).append({ type: joi .number() - .only(TRANSACTION_TYPES.DELEGATE_REGISTRATION) + .only(TransactionTypes.DelegateRegistration) .required(), amount: joi .alternatives() diff --git a/packages/crypto/src/validation/extensions/transactions/delegate-resignation.ts b/packages/crypto/src/validation/extensions/transactions/delegate-resignation.ts index 59e8bdefd7..c6e6ea6315 100644 --- a/packages/crypto/src/validation/extensions/transactions/delegate-resignation.ts +++ b/packages/crypto/src/validation/extensions/transactions/delegate-resignation.ts @@ -1,4 +1,4 @@ -import { TRANSACTION_TYPES } from "../../../constants"; +import { TransactionTypes } from "../../../constants"; import { base as transaction } from "./base"; export const delegateResignation = joi => ({ @@ -6,7 +6,7 @@ export const delegateResignation = joi => ({ base: transaction(joi).append({ type: joi .number() - .only(TRANSACTION_TYPES.DELEGATE_RESIGNATION) + .only(TransactionTypes.DelegateResignation) .required(), amount: joi .alternatives() diff --git a/packages/crypto/src/validation/extensions/transactions/ipfs.ts b/packages/crypto/src/validation/extensions/transactions/ipfs.ts index 9bdb5c15db..4f09f4225f 100644 --- a/packages/crypto/src/validation/extensions/transactions/ipfs.ts +++ b/packages/crypto/src/validation/extensions/transactions/ipfs.ts @@ -1,4 +1,4 @@ -import { TRANSACTION_TYPES } from "../../../constants"; +import { TransactionTypes } from "../../../constants"; import { base as transaction } from "./base"; export const ipfs = joi => ({ @@ -6,7 +6,7 @@ export const ipfs = joi => ({ base: transaction(joi).append({ type: joi .number() - .only(TRANSACTION_TYPES.IPFS) + .only(TransactionTypes.Ipfs) .required(), amount: joi .alternatives() diff --git a/packages/crypto/src/validation/extensions/transactions/multi-payment.ts b/packages/crypto/src/validation/extensions/transactions/multi-payment.ts index e8dc098d34..79d1464d79 100644 --- a/packages/crypto/src/validation/extensions/transactions/multi-payment.ts +++ b/packages/crypto/src/validation/extensions/transactions/multi-payment.ts @@ -1,4 +1,4 @@ -import { TRANSACTION_TYPES } from "../../../constants"; +import { TransactionTypes } from "../../../constants"; import { base as transaction } from "./base"; export const multiPayment = joi => ({ @@ -6,7 +6,7 @@ export const multiPayment = joi => ({ base: transaction(joi).append({ type: joi .number() - .only(TRANSACTION_TYPES.MULTI_PAYMENT) + .only(TransactionTypes.MultiPayment) .required(), asset: joi.object().required(), recipientId: joi.empty(), diff --git a/packages/crypto/src/validation/extensions/transactions/multi-signature.ts b/packages/crypto/src/validation/extensions/transactions/multi-signature.ts index 4c2efa7d84..2a022cbff5 100644 --- a/packages/crypto/src/validation/extensions/transactions/multi-signature.ts +++ b/packages/crypto/src/validation/extensions/transactions/multi-signature.ts @@ -1,4 +1,4 @@ -import { TRANSACTION_TYPES } from "../../../constants"; +import { TransactionTypes } from "../../../constants"; import { base as transaction } from "./base"; export const multiSignature = joi => ({ @@ -6,7 +6,7 @@ export const multiSignature = joi => ({ base: transaction(joi).append({ type: joi .number() - .only(TRANSACTION_TYPES.MULTI_SIGNATURE) + .only(TransactionTypes.MultiSignature) .required(), amount: joi .alternatives() diff --git a/packages/crypto/src/validation/extensions/transactions/second-signature.ts b/packages/crypto/src/validation/extensions/transactions/second-signature.ts index 38894950a5..fe1aa6bf7d 100644 --- a/packages/crypto/src/validation/extensions/transactions/second-signature.ts +++ b/packages/crypto/src/validation/extensions/transactions/second-signature.ts @@ -1,4 +1,4 @@ -import { TRANSACTION_TYPES } from "../../../constants"; +import { TransactionTypes } from "../../../constants"; import { base as transaction } from "./base"; export const secondSignature = joi => ({ @@ -6,7 +6,7 @@ export const secondSignature = joi => ({ base: transaction(joi).append({ type: joi .number() - .only(TRANSACTION_TYPES.SECOND_SIGNATURE) + .only(TransactionTypes.SecondSignature) .required(), amount: joi .alternatives() diff --git a/packages/crypto/src/validation/extensions/transactions/timelock-transfer.ts b/packages/crypto/src/validation/extensions/transactions/timelock-transfer.ts index 67ce69b223..b17b86f2d6 100644 --- a/packages/crypto/src/validation/extensions/transactions/timelock-transfer.ts +++ b/packages/crypto/src/validation/extensions/transactions/timelock-transfer.ts @@ -1,4 +1,4 @@ -import { TRANSACTION_TYPES } from "../../../constants"; +import { TransactionTypes } from "../../../constants"; import { base as transaction } from "./base"; export const timelockTransfer = joi => ({ @@ -6,7 +6,7 @@ export const timelockTransfer = joi => ({ base: transaction(joi).append({ type: joi .number() - .only(TRANSACTION_TYPES.MULTI_PAYMENT) + .only(TransactionTypes.MultiPayment) .required(), amount: joi .alternatives() diff --git a/packages/crypto/src/validation/extensions/transactions/transfer.ts b/packages/crypto/src/validation/extensions/transactions/transfer.ts index c8ea220baf..5352d9c830 100644 --- a/packages/crypto/src/validation/extensions/transactions/transfer.ts +++ b/packages/crypto/src/validation/extensions/transactions/transfer.ts @@ -1,4 +1,4 @@ -import { TRANSACTION_TYPES } from "../../../constants"; +import { TransactionTypes } from "../../../constants"; import { base as transaction } from "./base"; export const transfer = joi => ({ @@ -6,7 +6,7 @@ export const transfer = joi => ({ base: transaction(joi).append({ type: joi .number() - .only(TRANSACTION_TYPES.TRANSFER) + .only(TransactionTypes.Transfer) .required(), expiration: joi .number() diff --git a/packages/crypto/src/validation/extensions/transactions/vote.ts b/packages/crypto/src/validation/extensions/transactions/vote.ts index 4118b1c3ae..1e889f1e6d 100644 --- a/packages/crypto/src/validation/extensions/transactions/vote.ts +++ b/packages/crypto/src/validation/extensions/transactions/vote.ts @@ -1,4 +1,4 @@ -import { TRANSACTION_TYPES } from "../../../constants"; +import { TransactionTypes } from "../../../constants"; import { base as transaction } from "./base"; export const vote = joi => ({ @@ -6,7 +6,7 @@ export const vote = joi => ({ base: transaction(joi).append({ type: joi .number() - .only(TRANSACTION_TYPES.VOTE) + .only(TransactionTypes.Vote) .required(), amount: joi .alternatives() diff --git a/packages/crypto/src/validation/rules/models/transactions/delegate-registration.ts b/packages/crypto/src/validation/rules/models/transactions/delegate-registration.ts index 140fdf9151..5e4d168a14 100644 --- a/packages/crypto/src/validation/rules/models/transactions/delegate-registration.ts +++ b/packages/crypto/src/validation/rules/models/transactions/delegate-registration.ts @@ -1,4 +1,4 @@ -import { TRANSACTION_TYPES } from "../../../../constants"; +import { TransactionTypes } from "../../../../constants"; import { Engine } from "../../../engine"; export const delegateRegistration = transaction => { @@ -11,7 +11,7 @@ export const delegateRegistration = transaction => { .required(), // @ts-ignore blockid: Engine.joi.alternatives().try(Engine.joi.arkBlockId(), Engine.joi.number().unsafe()), - type: Engine.joi.number().valid(TRANSACTION_TYPES.DELEGATE_REGISTRATION), + type: Engine.joi.number().valid(TransactionTypes.DelegateRegistration), timestamp: Engine.joi .number() .integer() diff --git a/packages/crypto/src/validation/rules/models/transactions/delegate-resignation.ts b/packages/crypto/src/validation/rules/models/transactions/delegate-resignation.ts index 65edcf59d6..25faf17e2e 100644 --- a/packages/crypto/src/validation/rules/models/transactions/delegate-resignation.ts +++ b/packages/crypto/src/validation/rules/models/transactions/delegate-resignation.ts @@ -1,4 +1,4 @@ -import { TRANSACTION_TYPES } from "../../../../constants"; +import { TransactionTypes } from "../../../../constants"; import { Engine } from "../../../engine"; export const delegateResignation = transaction => { @@ -11,7 +11,7 @@ export const delegateResignation = transaction => { .required(), // @ts-ignore blockid: Engine.joi.alternatives().try(Engine.joi.arkBlockId(), Engine.joi.number().unsafe()), - type: Engine.joi.number().valid(TRANSACTION_TYPES.DELEGATE_RESIGNATION), + type: Engine.joi.number().valid(TransactionTypes.DelegateResignation), timestamp: Engine.joi .number() .integer() diff --git a/packages/crypto/src/validation/rules/models/transactions/ipfs.ts b/packages/crypto/src/validation/rules/models/transactions/ipfs.ts index 18bb2a3e61..3132fbbed0 100644 --- a/packages/crypto/src/validation/rules/models/transactions/ipfs.ts +++ b/packages/crypto/src/validation/rules/models/transactions/ipfs.ts @@ -1,4 +1,4 @@ -import { TRANSACTION_TYPES } from "../../../../constants"; +import { TransactionTypes } from "../../../../constants"; import { Engine } from "../../../engine"; export const ipfs = transaction => { @@ -11,7 +11,7 @@ export const ipfs = transaction => { .required(), // @ts-ignore blockid: Engine.joi.alternatives().try(Engine.joi.arkBlockId(), Engine.joi.number().unsafe()), - type: Engine.joi.number().valid(TRANSACTION_TYPES.IPFS), + type: Engine.joi.number().valid(TransactionTypes.Ipfs), timestamp: Engine.joi .number() .integer() diff --git a/packages/crypto/src/validation/rules/models/transactions/multi-payment.ts b/packages/crypto/src/validation/rules/models/transactions/multi-payment.ts index 5ddd562346..888e582ea7 100644 --- a/packages/crypto/src/validation/rules/models/transactions/multi-payment.ts +++ b/packages/crypto/src/validation/rules/models/transactions/multi-payment.ts @@ -1,4 +1,4 @@ -import { TRANSACTION_TYPES } from "../../../../constants"; +import { TransactionTypes } from "../../../../constants"; import { Engine } from "../../../engine"; export const multiPayment = transaction => { @@ -11,7 +11,7 @@ export const multiPayment = transaction => { .required(), // @ts-ignore blockid: Engine.joi.alternatives().try(Engine.joi.arkBlockId(), Engine.joi.number().unsafe()), - type: Engine.joi.number().valid(TRANSACTION_TYPES.MULTI_PAYMENT), + type: Engine.joi.number().valid(TransactionTypes.MultiPayment), timestamp: Engine.joi .number() .integer() diff --git a/packages/crypto/src/validation/rules/models/transactions/multi-signature.ts b/packages/crypto/src/validation/rules/models/transactions/multi-signature.ts index a03b821c35..827c6f3eff 100644 --- a/packages/crypto/src/validation/rules/models/transactions/multi-signature.ts +++ b/packages/crypto/src/validation/rules/models/transactions/multi-signature.ts @@ -1,4 +1,4 @@ -import { TRANSACTION_TYPES } from "../../../../constants"; +import { TransactionTypes } from "../../../../constants"; import { Engine } from "../../../engine"; export const multiSignature = transaction => { @@ -21,7 +21,7 @@ export const multiSignature = transaction => { .required(), // @ts-ignore blockid: Engine.joi.alternatives().try(Engine.joi.arkBlockId(), Engine.joi.number().unsafe()), - type: Engine.joi.number().valid(TRANSACTION_TYPES.MULTI_SIGNATURE), + type: Engine.joi.number().valid(TransactionTypes.MultiSignature), timestamp: Engine.joi .number() .integer() diff --git a/packages/crypto/src/validation/rules/models/transactions/second-signature.ts b/packages/crypto/src/validation/rules/models/transactions/second-signature.ts index 62705b4a08..4f8cd4e190 100644 --- a/packages/crypto/src/validation/rules/models/transactions/second-signature.ts +++ b/packages/crypto/src/validation/rules/models/transactions/second-signature.ts @@ -1,4 +1,4 @@ -import { TRANSACTION_TYPES } from "../../../../constants"; +import { TransactionTypes } from "../../../../constants"; import { Engine } from "../../../engine"; export const secondSignature = transaction => { @@ -11,7 +11,7 @@ export const secondSignature = transaction => { .required(), // @ts-ignore blockid: Engine.joi.alternatives().try(Engine.joi.arkBlockId(), Engine.joi.number().unsafe()), - type: Engine.joi.number().valid(TRANSACTION_TYPES.SECOND_SIGNATURE), + type: Engine.joi.number().valid(TransactionTypes.SecondSignature), timestamp: Engine.joi .number() .integer() diff --git a/packages/crypto/src/validation/rules/models/transactions/timelock-transfer.ts b/packages/crypto/src/validation/rules/models/transactions/timelock-transfer.ts index fa36d04202..c3e3326122 100644 --- a/packages/crypto/src/validation/rules/models/transactions/timelock-transfer.ts +++ b/packages/crypto/src/validation/rules/models/transactions/timelock-transfer.ts @@ -1,4 +1,4 @@ -import { TRANSACTION_TYPES } from "../../../../constants"; +import { TransactionTypes } from "../../../../constants"; import { Engine } from "../../../engine"; export const timelockTransfer = transaction => { @@ -11,7 +11,7 @@ export const timelockTransfer = transaction => { .required(), // @ts-ignore blockid: Engine.joi.alternatives().try(Engine.joi.arkBlockId(), Engine.joi.number().unsafe()), - type: Engine.joi.number().valid(TRANSACTION_TYPES.TIMELOCK_TRANSFER), + type: Engine.joi.number().valid(TransactionTypes.TimelockTransfer), timestamp: Engine.joi .number() .integer() diff --git a/packages/crypto/src/validation/rules/models/transactions/transfer.ts b/packages/crypto/src/validation/rules/models/transactions/transfer.ts index 969dc0c7e5..4b1caab527 100644 --- a/packages/crypto/src/validation/rules/models/transactions/transfer.ts +++ b/packages/crypto/src/validation/rules/models/transactions/transfer.ts @@ -1,4 +1,4 @@ -import { TRANSACTION_TYPES } from "../../../../constants"; +import { TransactionTypes } from "../../../../constants"; import { Engine } from "../../../engine"; export const transfer = transaction => { @@ -11,7 +11,7 @@ export const transfer = transaction => { .required(), // @ts-ignore blockid: Engine.joi.alternatives().try(Engine.joi.arkBlockId(), Engine.joi.number().unsafe()), - type: Engine.joi.number().valid(TRANSACTION_TYPES.TRANSFER), + type: Engine.joi.number().valid(TransactionTypes.Transfer), timestamp: Engine.joi .number() .integer() diff --git a/packages/crypto/src/validation/rules/models/transactions/vote.ts b/packages/crypto/src/validation/rules/models/transactions/vote.ts index ae60f238f8..01b458c4cd 100644 --- a/packages/crypto/src/validation/rules/models/transactions/vote.ts +++ b/packages/crypto/src/validation/rules/models/transactions/vote.ts @@ -1,4 +1,4 @@ -import { TRANSACTION_TYPES } from "../../../../constants"; +import { TransactionTypes } from "../../../../constants"; import { Engine } from "../../../engine"; export const vote = transaction => { @@ -11,7 +11,7 @@ export const vote = transaction => { .required(), // @ts-ignore blockid: Engine.joi.alternatives().try(Engine.joi.arkBlockId(), Engine.joi.number().unsafe()), - type: Engine.joi.number().valid(TRANSACTION_TYPES.VOTE), + type: Engine.joi.number().valid(TransactionTypes.Vote), timestamp: Engine.joi .number() .integer() diff --git a/yarn.lock b/yarn.lock index 8f5b37e497..3f36eba5c7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1558,7 +1558,7 @@ resolved "https://registry.yarnpkg.com/@types/jest/-/jest-23.3.10.tgz#4897974cc317bf99d4fe6af1efa15957fa9c94de" integrity sha512-DC8xTuW/6TYgvEg3HEXS7cu9OijFqprVDXXiOcdOKZCU/5PJNLZU37VVvmZHdtMiGOa8wAA/We+JzbdxFzQTRQ== -"@types/joi@^14.0.0": +"@types/joi@^14.0.0", "@types/joi@^14.0.1": version "14.0.1" resolved "https://registry.yarnpkg.com/@types/joi/-/joi-14.0.1.tgz#739be8a8899a75631a3c9f15611e54bbab06c024" integrity sha512-0uZZ+nffpr480zwwUXsk0Z5O0szllffNW1EbkI+dDzKhNKhiX4QOwpwK37WpKIpaPLk9V8U9y2We/VOeD6zyhQ==