From 12c86d5dbf329e77fc96c6ff04373e3bbabdaec9 Mon Sep 17 00:00:00 2001 From: Brian Faust Date: Sat, 15 Dec 2018 06:35:30 +0200 Subject: [PATCH 01/63] refactor(crypto): split testnet config into network, milestones and fees --- .circleci/config.yml | 24 +++---- packages/crypto/src/networks/ark/testnet.json | 71 ------------------- .../crypto/src/networks/ark/testnet/fees.json | 18 +++++ .../src/networks/ark/testnet/milestones.json | 31 ++++++++ .../src/networks/ark/testnet/network.json | 18 +++++ 5 files changed, 79 insertions(+), 83 deletions(-) delete mode 100644 packages/crypto/src/networks/ark/testnet.json create mode 100644 packages/crypto/src/networks/ark/testnet/fees.json create mode 100644 packages/crypto/src/networks/ark/testnet/milestones.json create mode 100644 packages/crypto/src/networks/ark/testnet/network.json diff --git a/.circleci/config.yml b/.circleci/config.yml index 6b0b4adf99..a71528c4a3 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -84,8 +84,8 @@ jobs: name: core-config command: 'cd ~/ark-core/packages/core-config && yarn test:coverage' - run: - name: core-forger - command: 'cd ~/ark-core/packages/core-forger && yarn test:coverage' + name: core + command: 'cd ~/ark-core/packages/core && yarn test:coverage' - run: name: Last 1000 lines of test output when: on_fail @@ -177,8 +177,8 @@ jobs: name: core-config command: 'cd ~/ark-core/packages/core-config && yarn test:coverage' - run: - name: core-forger - command: 'cd ~/ark-core/packages/core-forger && yarn test:coverage' + name: core + command: 'cd ~/ark-core/packages/core && yarn test:coverage' - run: name: Last 1000 lines of test output when: on_fail @@ -345,8 +345,8 @@ jobs: name: core-logger command: 'cd ~/ark-core/packages/core-logger && yarn test:coverage' - run: - name: core-api - command: 'cd ~/ark-core/packages/core-api && yarn test:coverage' + name: core-forger + command: 'cd ~/ark-core/packages/core-forger && yarn test:coverage' - run: name: core-debugger-cli command: 'cd ~/ark-core/packages/core-debugger-cli && yarn test:coverage' @@ -354,8 +354,8 @@ jobs: 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' + name: core-api + command: 'cd ~/ark-core/packages/core-api && yarn test:coverage' - run: name: Last 1000 lines of test output when: on_fail @@ -615,8 +615,8 @@ jobs: name: core-logger command: 'cd ~/ark-core/packages/core-logger && yarn test:coverage' - run: - name: core-api - command: 'cd ~/ark-core/packages/core-api && yarn test:coverage' + name: core-forger + command: 'cd ~/ark-core/packages/core-forger && yarn test:coverage' - run: name: core-debugger-cli command: 'cd ~/ark-core/packages/core-debugger-cli && yarn test:coverage' @@ -624,8 +624,8 @@ jobs: 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' + name: core-api + command: 'cd ~/ark-core/packages/core-api && yarn test:coverage' - run: name: Last 1000 lines of test output when: on_fail 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/ark/testnet/fees.json b/packages/crypto/src/networks/ark/testnet/fees.json new file mode 100644 index 0000000000..e6eec0cfc1 --- /dev/null +++ b/packages/crypto/src/networks/ark/testnet/fees.json @@ -0,0 +1,18 @@ +{ + "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 + } + } +} diff --git a/packages/crypto/src/networks/ark/testnet/milestones.json b/packages/crypto/src/networks/ark/testnet/milestones.json new file mode 100644 index 0000000000..51c32313cf --- /dev/null +++ b/packages/crypto/src/networks/ark/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/ark/testnet/network.json b/packages/crypto/src/networks/ark/testnet/network.json new file mode 100644 index 0000000000..0c68bb2a14 --- /dev/null +++ b/packages/crypto/src/networks/ark/testnet/network.json @@ -0,0 +1,18 @@ +{ + "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" + }, + "exceptions": {} +} From 8a0ef76d4389c7b807f12472ec0dfda0034ce899 Mon Sep 17 00:00:00 2001 From: Brian Faust Date: Sat, 15 Dec 2018 06:40:50 +0200 Subject: [PATCH 02/63] refactor(crypto): split devnet config into network, milestones and fees --- packages/crypto/src/networks/ark/devnet.json | 94 ------------------- .../crypto/src/networks/ark/devnet/fees.json | 18 ++++ .../src/networks/ark/devnet/milestones.json | 45 +++++++++ .../src/networks/ark/devnet/network.json | 33 +++++++ 4 files changed, 96 insertions(+), 94 deletions(-) delete mode 100644 packages/crypto/src/networks/ark/devnet.json create mode 100644 packages/crypto/src/networks/ark/devnet/fees.json create mode 100644 packages/crypto/src/networks/ark/devnet/milestones.json create mode 100644 packages/crypto/src/networks/ark/devnet/network.json 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/devnet/fees.json b/packages/crypto/src/networks/ark/devnet/fees.json new file mode 100644 index 0000000000..e6eec0cfc1 --- /dev/null +++ b/packages/crypto/src/networks/ark/devnet/fees.json @@ -0,0 +1,18 @@ +{ + "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 + } + } +} diff --git a/packages/crypto/src/networks/ark/devnet/milestones.json b/packages/crypto/src/networks/ark/devnet/milestones.json new file mode 100644 index 0000000000..2623dbc4c1 --- /dev/null +++ b/packages/crypto/src/networks/ark/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/ark/devnet/network.json b/packages/crypto/src/networks/ark/devnet/network.json new file mode 100644 index 0000000000..f3cbcbbac6 --- /dev/null +++ b/packages/crypto/src/networks/ark/devnet/network.json @@ -0,0 +1,33 @@ +{ + "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" + }, + "exceptions": { + "blocks": ["15895730198424359628", "14746174532446639362"], + "transactions": [ + "76bd168e57a4431a64617c4e7864df1e0be89831eabaa230e37643efae2def6f", + "90d06cb306dcc33faba59545e03d91ee83b0409e66a45ffe6a9e3b1049a0c521", + "0f7a3e8036fbaae7c76f7615b09b8c4f1337e96d87042d86e03cc5ab9b6ed745", + "23733214f347970a34ccd772f89396056309744688bd6dbc35129e1f12d46d2f", + "e30d7290ca9cab570aa72bf0365dde39b8d75fe65a4e804844e5708a021f8ab4", + "03d3902bb30f71c29151f8b85ff478be1dc5264785c8c84550b6b59339dc03c9", + "7a00dc347a50186bc0d789a7899f1a4dcbc1e5d5adbb5359df238cd2b9363b41", + "bbe266eac2bbc505b40e74ae6d1960d7c76d3ca8d4b942b6046f0c5f750ff9f4", + "cb63ee14068a8d2987c90ecb12998653161cd8748af7790c75592647260d3266", + "d184752c1546c366866013aa00a2a0f9b40463656072334fc302ff783ff4ee98", + "f8122e3d8b7ad31c58ed3254196b16c23249b8372f06de42191c43bfcf39849d" + ] + } +} From 9c3d8f7822d3abe0ee43dbc39220e3b0aca7dc16 Mon Sep 17 00:00:00 2001 From: Brian Faust Date: Sat, 15 Dec 2018 06:40:59 +0200 Subject: [PATCH 03/63] refactor(crypto): split mainnet config into network, milestones and fees --- .../crypto/src/networks/ark/mainnet/fees.json | 18 +++++++ .../src/networks/ark/mainnet/milestones.json | 38 +++++++++++++ .../{mainnet.json => mainnet/network.json} | 54 ------------------- 3 files changed, 56 insertions(+), 54 deletions(-) create mode 100644 packages/crypto/src/networks/ark/mainnet/fees.json create mode 100644 packages/crypto/src/networks/ark/mainnet/milestones.json rename packages/crypto/src/networks/ark/{mainnet.json => mainnet/network.json} (60%) diff --git a/packages/crypto/src/networks/ark/mainnet/fees.json b/packages/crypto/src/networks/ark/mainnet/fees.json new file mode 100644 index 0000000000..15d7af6fab --- /dev/null +++ b/packages/crypto/src/networks/ark/mainnet/fees.json @@ -0,0 +1,18 @@ +{ + "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 + } + } +} diff --git a/packages/crypto/src/networks/ark/mainnet/milestones.json b/packages/crypto/src/networks/ark/mainnet/milestones.json new file mode 100644 index 0000000000..6154db5dee --- /dev/null +++ b/packages/crypto/src/networks/ark/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/ark/mainnet.json b/packages/crypto/src/networks/ark/mainnet/network.json similarity index 60% rename from packages/crypto/src/networks/ark/mainnet.json rename to packages/crypto/src/networks/ark/mainnet/network.json index e193df70be..34ddafc8e7 100644 --- a/packages/crypto/src/networks/ark/mainnet.json +++ b/packages/crypto/src/networks/ark/mainnet/network.json @@ -14,60 +14,6 @@ "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"] }, From c40af390930eb6aaed3c0856ca560ae57b375a6a Mon Sep 17 00:00:00 2001 From: Brian Faust Date: Sat, 15 Dec 2018 06:45:14 +0200 Subject: [PATCH 04/63] fix(crypto): export configuration folders --- packages/crypto/src/networks/ark/bitcoin/index.ts | 3 +++ .../networks/ark/{bitcoin.json => bitcoin/network.json} | 0 packages/crypto/src/networks/ark/devnet/index.ts | 5 +++++ packages/crypto/src/networks/ark/index.ts | 8 ++++---- packages/crypto/src/networks/ark/mainnet/index.ts | 5 +++++ packages/crypto/src/networks/ark/testnet/index.ts | 5 +++++ 6 files changed, 22 insertions(+), 4 deletions(-) create mode 100644 packages/crypto/src/networks/ark/bitcoin/index.ts rename packages/crypto/src/networks/ark/{bitcoin.json => bitcoin/network.json} (100%) create mode 100644 packages/crypto/src/networks/ark/devnet/index.ts create mode 100644 packages/crypto/src/networks/ark/mainnet/index.ts create mode 100644 packages/crypto/src/networks/ark/testnet/index.ts diff --git a/packages/crypto/src/networks/ark/bitcoin/index.ts b/packages/crypto/src/networks/ark/bitcoin/index.ts new file mode 100644 index 0000000000..8d2f1ee23f --- /dev/null +++ b/packages/crypto/src/networks/ark/bitcoin/index.ts @@ -0,0 +1,3 @@ +import network from "./network.json"; + +export const bitcoin = { network }; diff --git a/packages/crypto/src/networks/ark/bitcoin.json b/packages/crypto/src/networks/ark/bitcoin/network.json similarity index 100% rename from packages/crypto/src/networks/ark/bitcoin.json rename to packages/crypto/src/networks/ark/bitcoin/network.json diff --git a/packages/crypto/src/networks/ark/devnet/index.ts b/packages/crypto/src/networks/ark/devnet/index.ts new file mode 100644 index 0000000000..0e450a036c --- /dev/null +++ b/packages/crypto/src/networks/ark/devnet/index.ts @@ -0,0 +1,5 @@ +import fees from "./fees.json"; +import milestones from "./milestones.json"; +import network from "./network.json"; + +export const devnet = { fees, milestones, network }; diff --git a/packages/crypto/src/networks/ark/index.ts b/packages/crypto/src/networks/ark/index.ts index 6707573a3c..b7a9ebd2f4 100644 --- a/packages/crypto/src/networks/ark/index.ts +++ b/packages/crypto/src/networks/ark/index.ts @@ -1,6 +1,6 @@ -import bitcoin from "./bitcoin.json"; -import devnet from "./devnet.json"; -import mainnet from "./mainnet.json"; -import testnet from "./testnet.json"; +import { bitcoin } from "./bitcoin"; +import { devnet } from "./devnet"; +import { mainnet } from "./mainnet"; +import { testnet } from "./testnet"; export { bitcoin, devnet, mainnet, testnet }; diff --git a/packages/crypto/src/networks/ark/mainnet/index.ts b/packages/crypto/src/networks/ark/mainnet/index.ts new file mode 100644 index 0000000000..6cf013f38f --- /dev/null +++ b/packages/crypto/src/networks/ark/mainnet/index.ts @@ -0,0 +1,5 @@ +import fees from "./fees.json"; +import milestones from "./milestones.json"; +import network from "./network.json"; + +export const mainnet = { fees, milestones, network }; diff --git a/packages/crypto/src/networks/ark/testnet/index.ts b/packages/crypto/src/networks/ark/testnet/index.ts new file mode 100644 index 0000000000..c037b5f7ae --- /dev/null +++ b/packages/crypto/src/networks/ark/testnet/index.ts @@ -0,0 +1,5 @@ +import fees from "./fees.json"; +import milestones from "./milestones.json"; +import network from "./network.json"; + +export const testnet = { fees, milestones, network }; From c7d3bd3ad8a9dac2c46334570dc9034275c85558 Mon Sep 17 00:00:00 2001 From: Brian Faust Date: Sat, 15 Dec 2018 07:18:13 +0200 Subject: [PATCH 05/63] refactor: map milestones and dynamic fees to the configuration --- .../src/utils/dynamicfee-matcher.ts | 8 ++-- .../crypto/__tests__/crypto/slots.test.ts | 4 +- .../crypto/__tests__/managers/config.test.ts | 40 ++++++++++--------- .../crypto/__tests__/models/block.test.ts | 2 +- .../__tests__/models/transaction.test.ts | 2 +- .../crypto/__tests__/models/wallet.test.ts | 4 +- packages/crypto/src/constants.ts | 10 ++--- packages/crypto/src/crypto/crypto.ts | 2 +- packages/crypto/src/managers/config.ts | 22 +++++----- packages/crypto/src/models/block.ts | 2 +- packages/crypto/src/models/transaction.ts | 2 +- .../src/networks/ark/devnet/dynamic-fees.json | 16 ++++++++ .../crypto/src/networks/ark/devnet/fees.json | 18 --------- .../crypto/src/networks/ark/devnet/index.ts | 4 +- .../networks/ark/mainnet/dynamic-fees.json | 16 ++++++++ .../crypto/src/networks/ark/mainnet/fees.json | 18 --------- .../crypto/src/networks/ark/mainnet/index.ts | 4 +- .../networks/ark/testnet/dynamic-fees.json | 16 ++++++++ .../crypto/src/networks/ark/testnet/fees.json | 18 --------- .../crypto/src/networks/ark/testnet/index.ts | 4 +- 20 files changed, 104 insertions(+), 108 deletions(-) create mode 100644 packages/crypto/src/networks/ark/devnet/dynamic-fees.json delete mode 100644 packages/crypto/src/networks/ark/devnet/fees.json create mode 100644 packages/crypto/src/networks/ark/mainnet/dynamic-fees.json delete mode 100644 packages/crypto/src/networks/ark/mainnet/fees.json create mode 100644 packages/crypto/src/networks/ark/testnet/dynamic-fees.json delete mode 100644 packages/crypto/src/networks/ark/testnet/fees.json diff --git a/packages/core-transaction-pool/src/utils/dynamicfee-matcher.ts b/packages/core-transaction-pool/src/utils/dynamicfee-matcher.ts index 3cbb401b2b..475cdcb398 100644 --- a/packages/core-transaction-pool/src/utils/dynamicfee-matcher.ts +++ b/packages/core-transaction-pool/src/utils/dynamicfee-matcher.ts @@ -15,13 +15,13 @@ export function dynamicFeeMatcher(transaction) { const id = transaction.id; const blockchain = app.resolvePlugin("blockchain"); - const fees = config.getConstants(blockchain.getLastBlock().data.height).fees; + const dynamicFees = config.get("dynamicFees"); let broadcast; let enterPool; - if (fees.dynamic) { - const minFeeBroadcast = dynamicFeeManager.calculateFee(fees.dynamicFees.minFeeBroadcast, transaction); + if (dynamicFees.enabled) { + const minFeeBroadcast = dynamicFeeManager.calculateFee(dynamicFees.minFeeBroadcast, transaction); if (fee >= minFeeBroadcast) { broadcast = true; logger.debug( @@ -38,7 +38,7 @@ export function dynamicFeeMatcher(transaction) { ); } - const minFeePool = dynamicFeeManager.calculateFee(fees.dynamicFees.minFeePool, transaction); + const minFeePool = dynamicFeeManager.calculateFee(dynamicFees.minFeePool, transaction); if (fee >= minFeePool) { enterPool = true; logger.debug( diff --git a/packages/crypto/__tests__/crypto/slots.test.ts b/packages/crypto/__tests__/crypto/slots.test.ts index 46bb407dd9..72e21285e1 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/ark"; -beforeEach(() => configManager.setConfig(network)); +beforeEach(() => configManager.setConfig(devnet)); describe("Slots", () => { describe("getHeight", () => { diff --git a/packages/crypto/__tests__/managers/config.test.ts b/packages/crypto/__tests__/managers/config.test.ts index f777e225ca..dbbb74b128 100644 --- a/packages/crypto/__tests__/managers/config.test.ts +++ b/packages/crypto/__tests__/managers/config.test.ts @@ -4,10 +4,9 @@ import { TRANSACTION_TYPES } 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/ark"; -beforeEach(() => configManager.setConfig(network)); +beforeEach(() => configManager.setConfig(devnet)); describe("Configuration", () => { it("should be instantiated", () => { @@ -15,9 +14,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), + ...["constants", "dynamicFees"], + ]); }); it('key should be "set"', () => { @@ -31,25 +33,25 @@ describe("Configuration", () => { }); it("should build constants", () => { - expect(configManager.constants).toEqual(network.constants); + expect(configManager.constants).toEqual(devnet.milestones); }); it("should build fees", () => { - const fees = network.constants[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); + const feesStatic = devnet.milestones[0].fees.staticFees; + + expect(feeManager.get(TRANSACTION_TYPES.TRANSFER)).toEqual(feesStatic.transfer); + expect(feeManager.get(TRANSACTION_TYPES.SECOND_SIGNATURE)).toEqual(feesStatic.secondSignature); + expect(feeManager.get(TRANSACTION_TYPES.DELEGATE_REGISTRATION)).toEqual(feesStatic.delegateRegistration); + expect(feeManager.get(TRANSACTION_TYPES.VOTE)).toEqual(feesStatic.vote); + expect(feeManager.get(TRANSACTION_TYPES.MULTI_SIGNATURE)).toEqual(feesStatic.multiSignature); + expect(feeManager.get(TRANSACTION_TYPES.IPFS)).toEqual(feesStatic.ipfs); + expect(feeManager.get(TRANSACTION_TYPES.TIMELOCK_TRANSFER)).toEqual(feesStatic.timelockTransfer); + expect(feeManager.get(TRANSACTION_TYPES.MULTI_PAYMENT)).toEqual(feesStatic.multiPayment); + expect(feeManager.get(TRANSACTION_TYPES.DELEGATE_RESIGNATION)).toEqual(feesStatic.delegateResignation); }); it("should build dynamic fee offsets", () => { - const addonBytes = network.constants[0].fees.dynamicFees.addonBytes; + const addonBytes = devnet.dynamicFees.addonBytes; expect(dynamicFeeManager.get(TRANSACTION_TYPES.TRANSFER)).toEqual(addonBytes.transfer); expect(dynamicFeeManager.get(TRANSACTION_TYPES.SECOND_SIGNATURE)).toEqual(addonBytes.secondSignature); @@ -63,7 +65,7 @@ describe("Configuration", () => { }); it("should get constants for height", () => { - expect(configManager.getConstants(21600)).toEqual(network.constants[2]); + expect(configManager.getConstants(21600)).toEqual(devnet.milestones[2]); }); it("should set the height", () => { diff --git a/packages/crypto/__tests__/models/block.test.ts b/packages/crypto/__tests__/models/block.test.ts index 313b001afb..ccd5ef18e1 100644 --- a/packages/crypto/__tests__/models/block.test.ts +++ b/packages/crypto/__tests__/models/block.test.ts @@ -6,7 +6,7 @@ import { Block } from "../../src/models/block"; import { Bignum } from "../../src/utils/bignum"; import { dummyBlock } from "./fixtures/block"; -const { outlookTable } = CONFIGURATIONS.ARK.MAINNET; +const { outlookTable } = CONFIGURATIONS.ARK.MAINNET.network; describe("Models - Block", () => { const data = { diff --git a/packages/crypto/__tests__/models/transaction.test.ts b/packages/crypto/__tests__/models/transaction.test.ts index 6fdeb43477..68c1a32d9e 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/ark"; const createRandomTx = type => { let transaction; diff --git a/packages/crypto/__tests__/models/wallet.test.ts b/packages/crypto/__tests__/models/wallet.test.ts index e083d32489..746900ffce 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/ark"; 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/src/constants.ts b/packages/crypto/src/constants.ts index 953c39604c..856537c4e1 100644 --- a/packages/crypto/src/constants.ts +++ b/packages/crypto/src/constants.ts @@ -1,6 +1,4 @@ -import configDevnet from "./networks/ark/devnet.json"; -import configMainnet from "./networks/ark/mainnet.json"; -import configTestnet from "./networks/ark/testnet.json"; +import { devnet, mainnet, testnet } from "./networks/ark"; /** * The Arktoshi base. @@ -54,8 +52,8 @@ export const TRANSACTION_TYPES = Object.freeze({ */ export const CONFIGURATIONS = Object.freeze({ ARK: { - MAINNET: configMainnet, - DEVNET: configDevnet, - TESTNET: configTestnet, + MAINNET: mainnet, + DEVNET: devnet, + TESTNET: testnet, }, }); diff --git a/packages/crypto/src/crypto/crypto.ts b/packages/crypto/src/crypto/crypto.ts index 874e372883..d3350d3f8c 100644 --- a/packages/crypto/src/crypto/crypto.ts +++ b/packages/crypto/src/crypto/crypto.ts @@ -12,7 +12,7 @@ import { feeManager } from "../managers/fee"; import { Bignum } from "../utils"; import { HashAlgorithms } from "./hash-algorithms"; -const { transactionIdFixTable } = CONFIGURATIONS.ARK.MAINNET; +const { transactionIdFixTable } = CONFIGURATIONS.ARK.MAINNET.network; class Crypto { /** diff --git a/packages/crypto/src/managers/config.ts b/packages/crypto/src/managers/config.ts index 2942229a45..161b6cb2a0 100644 --- a/packages/crypto/src/managers/config.ts +++ b/packages/crypto/src/managers/config.ts @@ -4,7 +4,7 @@ import { dynamicFeeManager } from "./dynamic-fee"; import { feeManager } from "./fee"; import { CONFIGURATIONS, TRANSACTION_TYPES } from "../constants"; -import defaultConfig from "../networks/ark/devnet.json"; +import { devnet } from "../networks/ark/devnet"; export class ConfigManager { public config: any; @@ -16,7 +16,7 @@ export class ConfigManager { * @constructor */ constructor() { - this.setConfig(defaultConfig); + this.setConfig(devnet); } /** @@ -26,10 +26,14 @@ 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.constants = config.milestones; + this.config.dynamicFees = config.dynamicFees; + this.buildConstants(); this.buildFees(); this.buildAddonBytes(); @@ -156,16 +160,14 @@ export class ConfigManager { * Build addon bytes from config constants. */ public buildAddonBytes() { - if (this.getConstant("fees").dynamicFees.addonBytes) { + const dynamicFees = this.config.dynamicFees; + + if (dynamicFees.addonBytes) { Object.keys(TRANSACTION_TYPES).forEach(type => - dynamicFeeManager.set( - TRANSACTION_TYPES[type], - this.getConstant("fees").dynamicFees.addonBytes[camelCase(type)], - ), + dynamicFeeManager.set(TRANSACTION_TYPES[type], dynamicFees.addonBytes[camelCase(type)]), ); } } } -const configManager = new ConfigManager(); -export { configManager }; +export const configManager = new ConfigManager(); diff --git a/packages/crypto/src/models/block.ts b/packages/crypto/src/models/block.ts index 87d286f569..5b8a2eee2a 100644 --- a/packages/crypto/src/models/block.ts +++ b/packages/crypto/src/models/block.ts @@ -8,7 +8,7 @@ import { configManager } from "../managers/config"; import { Bignum } from "../utils"; import { Transaction } from "./transaction"; -const { outlookTable } = CONFIGURATIONS.ARK.MAINNET; +const { outlookTable } = CONFIGURATIONS.ARK.MAINNET.network; const toBytesHex = data => { const temp = data ? new Bignum(data).toString(16) : ""; diff --git a/packages/crypto/src/models/transaction.ts b/packages/crypto/src/models/transaction.ts index 4f92d51f04..c0a0bff1ef 100644 --- a/packages/crypto/src/models/transaction.ts +++ b/packages/crypto/src/models/transaction.ts @@ -8,7 +8,7 @@ import { crypto } from "../crypto/crypto"; import { configManager } from "../managers/config"; import { Bignum } from "../utils"; -const { transactionIdFixTable } = CONFIGURATIONS.ARK.MAINNET; +const { transactionIdFixTable } = CONFIGURATIONS.ARK.MAINNET.network; /** * TODO copy some parts to ArkDocs diff --git a/packages/crypto/src/networks/ark/devnet/dynamic-fees.json b/packages/crypto/src/networks/ark/devnet/dynamic-fees.json new file mode 100644 index 0000000000..92af028d5d --- /dev/null +++ b/packages/crypto/src/networks/ark/devnet/dynamic-fees.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/ark/devnet/fees.json b/packages/crypto/src/networks/ark/devnet/fees.json deleted file mode 100644 index e6eec0cfc1..0000000000 --- a/packages/crypto/src/networks/ark/devnet/fees.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "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 - } - } -} diff --git a/packages/crypto/src/networks/ark/devnet/index.ts b/packages/crypto/src/networks/ark/devnet/index.ts index 0e450a036c..dfed411331 100644 --- a/packages/crypto/src/networks/ark/devnet/index.ts +++ b/packages/crypto/src/networks/ark/devnet/index.ts @@ -1,5 +1,5 @@ -import fees from "./fees.json"; +import dynamicFees from "./dynamic-fees.json"; import milestones from "./milestones.json"; import network from "./network.json"; -export const devnet = { fees, milestones, network }; +export const devnet = { dynamicFees, milestones, network }; diff --git a/packages/crypto/src/networks/ark/mainnet/dynamic-fees.json b/packages/crypto/src/networks/ark/mainnet/dynamic-fees.json new file mode 100644 index 0000000000..173d6e4295 --- /dev/null +++ b/packages/crypto/src/networks/ark/mainnet/dynamic-fees.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/ark/mainnet/fees.json b/packages/crypto/src/networks/ark/mainnet/fees.json deleted file mode 100644 index 15d7af6fab..0000000000 --- a/packages/crypto/src/networks/ark/mainnet/fees.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "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 - } - } -} diff --git a/packages/crypto/src/networks/ark/mainnet/index.ts b/packages/crypto/src/networks/ark/mainnet/index.ts index 6cf013f38f..f97c7643a7 100644 --- a/packages/crypto/src/networks/ark/mainnet/index.ts +++ b/packages/crypto/src/networks/ark/mainnet/index.ts @@ -1,5 +1,5 @@ -import fees from "./fees.json"; +import dynamicFees from "./dynamic-fees.json"; import milestones from "./milestones.json"; import network from "./network.json"; -export const mainnet = { fees, milestones, network }; +export const mainnet = { dynamicFees, milestones, network }; diff --git a/packages/crypto/src/networks/ark/testnet/dynamic-fees.json b/packages/crypto/src/networks/ark/testnet/dynamic-fees.json new file mode 100644 index 0000000000..92af028d5d --- /dev/null +++ b/packages/crypto/src/networks/ark/testnet/dynamic-fees.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/ark/testnet/fees.json b/packages/crypto/src/networks/ark/testnet/fees.json deleted file mode 100644 index e6eec0cfc1..0000000000 --- a/packages/crypto/src/networks/ark/testnet/fees.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "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 - } - } -} diff --git a/packages/crypto/src/networks/ark/testnet/index.ts b/packages/crypto/src/networks/ark/testnet/index.ts index c037b5f7ae..2636532a32 100644 --- a/packages/crypto/src/networks/ark/testnet/index.ts +++ b/packages/crypto/src/networks/ark/testnet/index.ts @@ -1,5 +1,5 @@ -import fees from "./fees.json"; +import dynamicFees from "./dynamic-fees.json"; import milestones from "./milestones.json"; import network from "./network.json"; -export const testnet = { fees, milestones, network }; +export const testnet = { dynamicFees, milestones, network }; From b2d4374fe8d3b1522846a9b468ca574496aaa6f5 Mon Sep 17 00:00:00 2001 From: Brian Faust Date: Sat, 15 Dec 2018 07:39:36 +0200 Subject: [PATCH 06/63] test(crypto): adjust network imports --- .../crypto/__tests__/crypto/crypto.test.ts | 8 +++---- .../crypto/__tests__/crypto/hdwallet.test.ts | 4 ++-- .../crypto/__tests__/managers/network.test.ts | 6 ++--- .../crypto/__tests__/models/delegate.test.ts | 22 +++++++++---------- .../__tests__/models/transaction.test.ts | 2 +- packages/crypto/src/managers/config.ts | 2 +- packages/crypto/src/models/delegate.ts | 2 +- 7 files changed, 23 insertions(+), 23 deletions(-) diff --git a/packages/crypto/__tests__/crypto/crypto.test.ts b/packages/crypto/__tests__/crypto/crypto.test.ts index 2e578279c9..477615ba37 100644 --- a/packages/crypto/__tests__/crypto/crypto.test.ts +++ b/packages/crypto/__tests__/crypto/crypto.test.ts @@ -239,9 +239,9 @@ describe("crypto.js", () => { it("should get address from compressed WIF (mainnet)", () => { const keys = crypto.getKeysFromWIF( "SAaaKsDdWMXP5BoVnSBLwTLn48n96UvG42WSUUooRv1HrEHmaSd4", - CONFIGURATIONS.ARK.MAINNET, + CONFIGURATIONS.ARK.MAINNET.network, ); - const address = crypto.getAddress(keys.publicKey, CONFIGURATIONS.ARK.MAINNET.pubKeyHash); + const address = crypto.getAddress(keys.publicKey, CONFIGURATIONS.ARK.MAINNET.network.pubKeyHash); expect(keys.compressed).toBeTruthy(); expect(address).toBe("APnrtb2JGa6WjrRik9W3Hjt6h71mD6Zgez"); }); @@ -249,9 +249,9 @@ describe("crypto.js", () => { it("should get address from compressed WIF (devnet)", () => { const keys = crypto.getKeysFromWIF( "SAaaKsDdWMXP5BoVnSBLwTLn48n96UvG42WSUUooRv1HrEHmaSd4", - CONFIGURATIONS.ARK.DEVNET, + CONFIGURATIONS.ARK.DEVNET.network, ); - const address = crypto.getAddress(keys.publicKey, CONFIGURATIONS.ARK.DEVNET.pubKeyHash); + const address = crypto.getAddress(keys.publicKey, CONFIGURATIONS.ARK.DEVNET.network.pubKeyHash); expect(keys.compressed).toBeTruthy(); expect(address).toBe("DDA5nM7KEqLeTtQKv5qGgcnc6dpNBKJNTS"); }); diff --git a/packages/crypto/__tests__/crypto/hdwallet.test.ts b/packages/crypto/__tests__/crypto/hdwallet.test.ts index 3a72a7d9c3..7c2b7d388e 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/ark"; 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__/managers/network.test.ts b/packages/crypto/__tests__/managers/network.test.ts index fd3228718e..51d99a3bc4 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/ark"; 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/delegate.test.ts b/packages/crypto/__tests__/models/delegate.test.ts index 3da53a00c2..913c33b318 100644 --- a/packages/crypto/__tests__/models/delegate.test.ts +++ b/packages/crypto/__tests__/models/delegate.test.ts @@ -20,7 +20,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 +29,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 +37,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 +48,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 +62,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 +87,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 +98,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 +115,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 +123,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 68c1a32d9e..bb887bfbd2 100644 --- a/packages/crypto/__tests__/models/transaction.test.ts +++ b/packages/crypto/__tests__/models/transaction.test.ts @@ -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/src/managers/config.ts b/packages/crypto/src/managers/config.ts index 161b6cb2a0..d3f451d03e 100644 --- a/packages/crypto/src/managers/config.ts +++ b/packages/crypto/src/managers/config.ts @@ -4,7 +4,7 @@ import { dynamicFeeManager } from "./dynamic-fee"; import { feeManager } from "./fee"; import { CONFIGURATIONS, TRANSACTION_TYPES } from "../constants"; -import { devnet } from "../networks/ark/devnet"; +import { devnet } from "../networks/ark"; export class ConfigManager { public config: any; 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 From 62bcbffeffd13843405c4e53bef7d80249148e52 Mon Sep 17 00:00:00 2001 From: Brian Faust Date: Sat, 15 Dec 2018 08:08:57 +0200 Subject: [PATCH 07/63] test(core-config): adjust tests to new config structure --- .../__tests__/__stubs__/network.json | 64 ------------------- .../__stubs__/network/dynamic-fees.json | 16 +++++ .../__tests__/__stubs__/network/index.js | 5 ++ .../__stubs__/network/milestones.json | 31 +++++++++ .../__tests__/__stubs__/network/network.json | 18 ++++++ packages/core-config/__tests__/loader.test.ts | 4 ++ packages/core-config/src/loader.ts | 8 ++- 7 files changed, 79 insertions(+), 67 deletions(-) delete mode 100644 packages/core-config/__tests__/__stubs__/network.json create mode 100644 packages/core-config/__tests__/__stubs__/network/dynamic-fees.json create mode 100644 packages/core-config/__tests__/__stubs__/network/index.js create mode 100644 packages/core-config/__tests__/__stubs__/network/milestones.json create mode 100644 packages/core-config/__tests__/__stubs__/network/network.json 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__/__stubs__/network/dynamic-fees.json b/packages/core-config/__tests__/__stubs__/network/dynamic-fees.json new file mode 100644 index 0000000000..92af028d5d --- /dev/null +++ b/packages/core-config/__tests__/__stubs__/network/dynamic-fees.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-config/__tests__/__stubs__/network/index.js b/packages/core-config/__tests__/__stubs__/network/index.js new file mode 100644 index 0000000000..9b1b944d73 --- /dev/null +++ b/packages/core-config/__tests__/__stubs__/network/index.js @@ -0,0 +1,5 @@ +const dynamicFees = require("./dynamic-fees.json"); +const milestones = require("./milestones.json"); +const network = require("./network.json"); + +module.exports = { dynamicFees, milestones, network }; diff --git a/packages/core-config/__tests__/__stubs__/network/milestones.json b/packages/core-config/__tests__/__stubs__/network/milestones.json new file mode 100644 index 0000000000..51c32313cf --- /dev/null +++ b/packages/core-config/__tests__/__stubs__/network/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-config/__tests__/__stubs__/network/network.json b/packages/core-config/__tests__/__stubs__/network/network.json new file mode 100644 index 0000000000..0c68bb2a14 --- /dev/null +++ b/packages/core-config/__tests__/__stubs__/network/network.json @@ -0,0 +1,18 @@ +{ + "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" + }, + "exceptions": {} +} diff --git a/packages/core-config/__tests__/loader.test.ts b/packages/core-config/__tests__/loader.test.ts index 6a7b4f5b4f..6fde314427 100644 --- a/packages/core-config/__tests__/loader.test.ts +++ b/packages/core-config/__tests__/loader.test.ts @@ -32,6 +32,10 @@ describe("Config Loader", () => { it("should succeed with a config", async () => { const result = await loader.setUp(stubConfig); + stubConfig.network.milestones[1] = { ...stubConfig.network.milestones[0] }; + stubConfig.network.milestones[1].height = 75600; + stubConfig.network.milestones[1].reward = 200000000; + expect(loader.delegates).toEqual(stubConfig.delegates); expect(loader.genesisBlock).toEqual(stubConfig.genesisBlock); expect(loader.network).toEqual(stubConfig.network); diff --git a/packages/core-config/src/loader.ts b/packages/core-config/src/loader.ts index e9aae67ca2..17e2ad5f47 100644 --- a/packages/core-config/src/loader.ts +++ b/packages/core-config/src/loader.ts @@ -123,9 +123,11 @@ export class Loader { */ public _validateConfig(): void { try { - strictEqual(Number.isInteger(this.network.pubKeyHash), true); - strictEqual(this.network.nethash.length, 64); - strictEqual(Number.isInteger(this.network.wif), true); + const network = this.network.network; + + strictEqual(Number.isInteger(network.pubKeyHash), true); + strictEqual(network.nethash.length, 64); + strictEqual(Number.isInteger(network.wif), true); } catch (error) { throw Error(error.message); process.exit(1); From f62fceb9ea0468bce85c2d6883acd1e1a1f619f8 Mon Sep 17 00:00:00 2001 From: Brian Faust Date: Sat, 15 Dec 2018 08:09:20 +0200 Subject: [PATCH 08/63] refactor(core-container): load configuration from new folder --- packages/core-container/src/environment.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core-container/src/environment.ts b/packages/core-container/src/environment.ts index 95cc8c9bad..bcf623ea9d 100644 --- a/packages/core-container/src/environment.ts +++ b/packages/core-container/src/environment.ts @@ -49,7 +49,7 @@ export class Environment { config = NetworkManager.findByName(this.variables.network, this.variables.token); } else { try { - const networkPath = resolve(expandHomeDir(`${process.env.ARK_PATH_CONFIG}/network.json`)); + const networkPath = resolve(expandHomeDir(`${process.env.ARK_PATH_CONFIG}/network`)); config = require(networkPath); } catch (error) { From bb78d72f19bbf6632533e6dce3f58979d2de4b25 Mon Sep 17 00:00:00 2001 From: Brian Faust Date: Sat, 15 Dec 2018 08:09:48 +0200 Subject: [PATCH 09/63] style(core-p2p): prettier format --- packages/core-p2p/src/monitor.ts | 60 ++++++++++++++++---------------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/packages/core-p2p/src/monitor.ts b/packages/core-p2p/src/monitor.ts index b9df7a7cd2..a1c3ad083f 100755 --- a/packages/core-p2p/src/monitor.ts +++ b/packages/core-p2p/src/monitor.ts @@ -388,11 +388,11 @@ class Monitor { for (const peer of shuffledPeers) { try { - const hisPeers = await peer.getPeers() + const hisPeers = await peer.getPeers(); for (const p of hisPeers) { if (Peer.isOk(p) && !this.getPeer(p.ip) && !this.guard.isMyself(p)) { - this.__addPeer(p) + this.__addPeer(p); } } } catch (error) { @@ -720,34 +720,6 @@ class Monitor { } } - /** - * Populate the initial seed list. - * @return {void} - */ - private populateSeedPeers() { - if (!config.peers.list) { - app.forceExit("No seed peers defined in peers.json :interrobang:"); - } - - let peers = config.peers.list.map(peer => { - peer.version = app.getVersion(); - return peer; - }); - - if (config.peers_backup) { - peers = { ...peers, ...config.peers_backup }; - } - - const filteredPeers: any[] = Object.values(peers).filter( - peer => !this.guard.isMyself(peer) || !this.guard.isValidPort(peer) || !this.guard.isValidVersion(peer), - ); - - for (const peer of filteredPeers) { - delete this.guard.suspensions[peer.ip]; - this.peers[peer.ip] = new Peer(peer.ip, peer.port); - } - } - /** * Get last 10 block IDs from database. * @return {[]String} @@ -832,6 +804,34 @@ class Monitor { this.__addPeer(peer); } } + + /** + * Populate the initial seed list. + * @return {void} + */ + private populateSeedPeers() { + if (!config.peers.list) { + app.forceExit("No seed peers defined in peers.json :interrobang:"); + } + + let peers = config.peers.list.map(peer => { + peer.version = app.getVersion(); + return peer; + }); + + if (config.peers_backup) { + peers = { ...peers, ...config.peers_backup }; + } + + const filteredPeers: any[] = Object.values(peers).filter( + peer => !this.guard.isMyself(peer) || !this.guard.isValidPort(peer) || !this.guard.isValidVersion(peer), + ); + + for (const peer of filteredPeers) { + delete this.guard.suspensions[peer.ip]; + this.peers[peer.ip] = new Peer(peer.ip, peer.port); + } + } } const monitor = new Monitor(); From 6449006aa016645a10c4e25cddb02eb6b0a79f76 Mon Sep 17 00:00:00 2001 From: Brian Faust Date: Sat, 15 Dec 2018 08:18:24 +0200 Subject: [PATCH 10/63] feat(core-config): add get and set methods --- packages/core-config/__tests__/loader.test.ts | 2 +- packages/core-config/package.json | 6 +- packages/core-config/src/loader.ts | 15 + yarn.lock | 3019 ++++++++++++++++- 4 files changed, 2960 insertions(+), 82 deletions(-) diff --git a/packages/core-config/__tests__/loader.test.ts b/packages/core-config/__tests__/loader.test.ts index 6fde314427..7a340bc15f 100644 --- a/packages/core-config/__tests__/loader.test.ts +++ b/packages/core-config/__tests__/loader.test.ts @@ -38,6 +38,6 @@ describe("Config Loader", () => { expect(loader.delegates).toEqual(stubConfig.delegates); expect(loader.genesisBlock).toEqual(stubConfig.genesisBlock); - expect(loader.network).toEqual(stubConfig.network); + expect(loader.network).toEqual(stubConfig.network.network); }); }); diff --git a/packages/core-config/package.json b/packages/core-config/package.json index e4eae703b7..b1d3f548f8 100644 --- a/packages/core-config/package.json +++ b/packages/core-config/package.json @@ -29,8 +29,12 @@ "dependencies": { "@arkecosystem/crypto": "^2.1.0", "@types/fs-extra": "^5.0.4", + "@types/lodash.get": "^4.4.4", + "@types/lodash.set": "^4.3.4", "axios": "^0.18.0", - "fs-extra": "^7.0.1" + "fs-extra": "^7.0.1", + "lodash.get": "^4.4.2", + "lodash.set": "^4.3.2" }, "publishConfig": { "access": "public" diff --git a/packages/core-config/src/loader.ts b/packages/core-config/src/loader.ts index 17e2ad5f47..f4cfdaf15a 100644 --- a/packages/core-config/src/loader.ts +++ b/packages/core-config/src/loader.ts @@ -2,6 +2,8 @@ import { configManager } from "@arkecosystem/crypto"; import { strictEqual } from "assert"; import axios from "axios"; import { existsSync, readdirSync, writeFileSync } from "fs-extra"; +import get from "lodash/get"; +import set from "lodash/set"; import { basename, extname, resolve } from "path"; export class Loader { @@ -26,6 +28,19 @@ export class Loader { this._validateConfig(); configManager.setConfig(this.network); + + // TODO: change once the config object has been implemented + this.network = this.network.network; + } + + public get(key: string, defaultValue: any = null): any { + // TODO: change to a config object that holds all values + return get(this.network, key, defaultValue); + } + + public set(key: string, value: any): void { + // TODO: change to a config object that holds all values + set(this.network, key, value); } /** diff --git a/yarn.lock b/yarn.lock index acbfafa129..d38c721c82 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,18 @@ # yarn lockfile v1 +"@apollographql/apollo-tools@^0.2.6": + version "0.2.9" + resolved "https://registry.yarnpkg.com/@apollographql/apollo-tools/-/apollo-tools-0.2.9.tgz#1e20999d11728ef47f8f812f2be0426b5dde1a51" + integrity sha512-AEIQwPkS0QLbkpb6WyRhV4aOMxuErasp47ABv5niDKOasQH8mrD8JSGKJAHuQxVe4kB8DE9sLRoc5qeQ0KFCHA== + dependencies: + apollo-env "0.2.5" + +"@apollographql/graphql-playground-html@^1.6.6": + version "1.6.6" + resolved "https://registry.yarnpkg.com/@apollographql/graphql-playground-html/-/graphql-playground-html-1.6.6.tgz#022209e28a2b547dcde15b219f0c50f47aa5beb3" + integrity sha512-lqK94b+caNtmKFs5oUVXlSpN3sm5IXZ+KfhMxOtr0LR2SqErzkoJilitjDvJ1WbjHlxLI7WtCjRmOLdOGJqtMQ== + "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.0.0-beta.35": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8" @@ -583,6 +595,31 @@ lodash "^4.17.10" to-fast-properties "^2.0.0" +"@bugsnag/browser@^5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@bugsnag/browser/-/browser-5.0.2.tgz#6fcabdd622da82a586428f4b599c9a3fbc664167" + integrity sha512-uhjfoMU8MGRHdsIE8QqGclhopxcrlGgbwrZVLsWVgtiet2H/phGdwJl/6DTw+W9rTK1SmW1CpzAUCN+XfVI+JA== + +"@bugsnag/js@^5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@bugsnag/js/-/js-5.0.2.tgz#5bfffca3ed87a27e4ba898a9f46c4e377c3d65e1" + integrity sha512-CdilcBCrP2vdosbtoMzEjORX4/BDGTOVp1+WrYY58KbjFoSDc1fUmjPjqAmHxdZKty7oi5PAQeQv0fh3nsdtgQ== + dependencies: + "@bugsnag/browser" "^5.0.2" + "@bugsnag/node" "^5.0.2" + +"@bugsnag/node@^5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@bugsnag/node/-/node-5.0.2.tgz#7d762f4c5d416cdfe01df86eff8d7cc53401d0e5" + integrity sha512-ad1lR6cE8mXOzFVV9wt/pP8fxZ2gfCvR+p7BIm4c+urSaw+0UnW+/ej6uozbYmhlKTpp8KE1SXU/lr16EM2vvA== + dependencies: + byline "^5.0.0" + error-stack-parser "^2.0.2" + iserror "^0.0.2" + pump "^3.0.0" + request "^2.87.0" + stack-generator "^2.0.3" + "@iamstarkov/listr-update-renderer@0.4.1": version "0.4.1" resolved "https://registry.yarnpkg.com/@iamstarkov/listr-update-renderer/-/listr-update-renderer-0.4.1.tgz#d7c48092a2dcf90fd672b6c8b458649cb350c77e" @@ -597,6 +634,22 @@ log-update "^2.3.0" strip-ansi "^3.0.1" +"@keyv/sql@1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@keyv/sql/-/sql-1.1.2.tgz#1dd84a5c5ad2384df8934f0ddfe20ab81dc2a75d" + integrity sha1-HdhKXFrSOE34k08N3+IKuB3Cp10= + dependencies: + sql "~0.78.0" + +"@keyv/sqlite@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@keyv/sqlite/-/sqlite-2.0.0.tgz#1cd03849e027bc8ba7dd37ab3a89ef38856362d8" + integrity sha512-7rsbZwIFwmxH5N4TCZM1C3ci55jLB4MaFooeAu/yHwBxO/4JuvsS2k0hX7V9rGqsjcfmwFF0qfUzltC45dOZHQ== + dependencies: + "@keyv/sql" "1.1.2" + pify "3.0.0" + sqlite3 "4.0.2" + "@lerna/add@^3.6.0": version "3.6.0" resolved "https://registry.yarnpkg.com/@lerna/add/-/add-3.6.0.tgz#eea53efff0b3237774ddac6eaa84957140e89238" @@ -1170,6 +1223,59 @@ resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== +"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" + integrity sha1-m4sMxmPWaafY9vXQiToU00jzD78= + +"@protobufjs/base64@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735" + integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== + +"@protobufjs/codegen@^2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb" + integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== + +"@protobufjs/eventemitter@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70" + integrity sha1-NVy8mLr61ZePntCV85diHx0Ga3A= + +"@protobufjs/fetch@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45" + integrity sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU= + dependencies: + "@protobufjs/aspromise" "^1.1.1" + "@protobufjs/inquire" "^1.1.0" + +"@protobufjs/float@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1" + integrity sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E= + +"@protobufjs/inquire@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089" + integrity sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik= + +"@protobufjs/path@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d" + integrity sha1-bMKyDFya1q0NzP0hynZz2Nf79o0= + +"@protobufjs/pool@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54" + integrity sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q= + +"@protobufjs/utf8@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" + integrity sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA= + "@samverschueren/stream-to-observable@^0.3.0": version "0.3.0" resolved "https://registry.yarnpkg.com/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz#ecdf48d532c58ea477acfcab80348424f8d0662f" @@ -1177,6 +1283,71 @@ dependencies: any-observable "^0.3.0" +"@sentry/core@4.4.2": + version "4.4.2" + resolved "https://registry.yarnpkg.com/@sentry/core/-/core-4.4.2.tgz#562526bc634c087f04bbca68b09cedc4b41cc64d" + integrity sha512-hJyAodTCf4sZfVdf41Rtuzj4EsyzYq5rdMZ+zc2Vinwdf8D0/brHe91fHeO0CKXEb2P0wJsrjwMidG/ccq/M8A== + dependencies: + "@sentry/hub" "4.4.2" + "@sentry/minimal" "4.4.2" + "@sentry/types" "4.4.2" + "@sentry/utils" "4.4.2" + tslib "^1.9.3" + +"@sentry/hub@4.4.2": + version "4.4.2" + resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-4.4.2.tgz#1399556fda06fb83c4f186c4aa842725f520159c" + integrity sha512-oe9ytXkTWyD+QmOpVzHAqTbRV4Hc0ee2Nt6HvrDtRmlXzQxfvTWG2F8KYT6w8kzqg5klnuRpnsmgTTV3KuNBVQ== + dependencies: + "@sentry/types" "4.4.2" + "@sentry/utils" "4.4.2" + tslib "^1.9.3" + +"@sentry/minimal@4.4.2": + version "4.4.2" + resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-4.4.2.tgz#13fffc6b17a2401b6a79947838a637626ab80b10" + integrity sha512-GEZZiNvVgqFAESZhAe3vjwTInn13lI2bSI3ItQN4RUWKL/W4n/fwVoDJbkb1U8aWxanuMnRDEpKwyQv6zYTZfw== + dependencies: + "@sentry/hub" "4.4.2" + "@sentry/types" "4.4.2" + tslib "^1.9.3" + +"@sentry/node@^4.4.2": + version "4.4.2" + resolved "https://registry.yarnpkg.com/@sentry/node/-/node-4.4.2.tgz#549921d2df3cbf58ebcfb525c3005c3fec4739a3" + integrity sha512-8/KlSdfVhledZ6PS6muxZY5r2pqhw8MNSXP7AODR2qRrHwsbnirVgV21WIAYAjKXEfYQGbm69lyoaTJGazlQ3Q== + dependencies: + "@sentry/core" "4.4.2" + "@sentry/hub" "4.4.2" + "@sentry/types" "4.4.2" + "@sentry/utils" "4.4.2" + "@types/stack-trace" "0.0.29" + cookie "0.3.1" + https-proxy-agent "^2.2.1" + lsmod "1.0.0" + stack-trace "0.0.10" + tslib "^1.9.3" + +"@sentry/types@4.4.2": + version "4.4.2" + resolved "https://registry.yarnpkg.com/@sentry/types/-/types-4.4.2.tgz#f38dd3bc671cd2f5983a85553aebeac9c2286b17" + integrity sha512-QyQd6PKKIyjJgaq/RQjsxPJEWbXcuiWZ9RvSnhBjS5jj53HEzkM1qkbAFqlYHJ1DTJJ1EuOM4+aTmGzHe93zuA== + +"@sentry/utils@4.4.2": + version "4.4.2" + resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-4.4.2.tgz#e05a47e135ecef29e63a996f59aee8c8f792c222" + integrity sha512-j/Ad8G1abHlJdD2q7aWWbSOSeWB5M5v1R1VKL8YPlwEbSvvmEQWePhBKFI0qlnKd2ObdUQsj86pHEXJRSFNfCw== + dependencies: + "@sentry/types" "4.4.2" + tslib "^1.9.3" + +"@sindresorhus/is@^0.12.0": + version "0.12.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.12.0.tgz#55c37409c809e802efea25911a579731adfc6e07" + integrity sha512-9ve22cGrAKlSRvi8Vb2JIjzcaaQg79531yQHnF+hi/kOpsSj3Om8AyR1wcHrgl0u7U3vYQ7gmF5erZzOp4+51Q== + dependencies: + symbol-observable "^1.2.0" + "@sindresorhus/tsconfig@^0.1.1": version "0.1.1" resolved "https://registry.yarnpkg.com/@sindresorhus/tsconfig/-/tsconfig-0.1.1.tgz#c13d7d79ab5a7b02c2374487d0822695a1baa496" @@ -1197,18 +1368,113 @@ resolved "https://registry.yarnpkg.com/@snyk/gemfile/-/gemfile-1.1.0.tgz#8c254dfc7739b2e8513c44c976fc41872d5f6af0" integrity sha512-mLwF+ccuvRZMS0SxUAxA3dAp8mB3m2FxIsBIUWFTYvzxl+E4XTZb8uFrUqXHbcxhZH1Z8taHohNTbzXZn3M8ag== +"@szmarczak/http-timer@^1.1.0": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.1.tgz#6402258dfe467532b26649ef076b4d11f74fb612" + integrity sha512-WljfOGkmSJe8SUkl+4TPvN2ec0dpUGVyfTBQLoXJUiILs+wBSc4Kvp2N3aAWE4VwwDSLGdmD3/bufS5BgZpVSQ== + dependencies: + defer-to-connect "^1.0.1" + +"@types/better-sqlite3@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@types/better-sqlite3/-/better-sqlite3-5.0.1.tgz#6ee7dab28e724f289c6e7c4f5108566e7e9b6bae" + integrity sha512-sChWxAuLlTl7IlEaFAsGeQIgdkQQ0U0v3i7RkMZ9oxk3BbYRl6Mxx56w7yM+RhZpo3+b9TR3xGdqPgy5UDpfDQ== + dependencies: + "@types/integer" "*" + +"@types/bip32@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/bip32/-/bip32-1.0.0.tgz#792b26521267effbee4cb048f3425d114ad1e4f8" + integrity sha512-BXLhOIsl6vzm+OOHmb5aHMs/eCt3xY7sO9xDfMtNoQl5UyrUMR+QREFLZ1zDl0jt0mkFBhhp5mtEefUOQDTuRA== + dependencies: + "@types/node" "*" + +"@types/bip38@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@types/bip38/-/bip38-2.0.0.tgz#2c8bed75ac77aefead77580147fe6cac443c133b" + integrity sha512-R8/rsp9fbqrxTg6FelmEuiNR39/VIrmNtbyG487Q9ObhPnxf+HZ/Sc0FvqcqLq+Mbcj5bjXSDu+wB3dNeZS1zQ== + dependencies: + "@types/node" "*" + +"@types/bip39@^2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@types/bip39/-/bip39-2.4.1.tgz#1a47b453b59a50d7b5856819b834c74798915eb3" + integrity sha512-QHx0qI6JaTIW/S3zxE/bXrwOWu6Boos+LZ4438xmFAHY5k+qHkExMdAnb/DENEt2RBnOdZ6c5J+SHrnLEhUohQ== + dependencies: + "@types/node" "*" + +"@types/bluebird@*", "@types/bluebird@^3.5.24": + version "3.5.25" + resolved "https://registry.yarnpkg.com/@types/bluebird/-/bluebird-3.5.25.tgz#59188b871208092e37767e4b3d80c3b3eaae43bd" + integrity sha512-yfhIBix+AIFTmYGtkC0Bi+XGjSkOINykqKvO/Wqdz/DuXlAKK7HmhLAXdPIGsV4xzKcL3ev/zYc4yLNo+OvGaw== + +"@types/braces@*": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@types/braces/-/braces-2.3.0.tgz#d00ec0a76562b2acb6f29330be33a093e33ed25c" + integrity sha512-A3MV5EsLHgShHoJ/XES/fQAnwNISKLrFuH9eNBZY5OkTQB7JPIwbRoExvRpDsNABvkMojnKqKWS8x0m2rLYi+A== + +"@types/bson@*": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@types/bson/-/bson-1.0.11.tgz#c95ad69bb0b3f5c33b4bb6cc86d86cafb273335c" + integrity sha512-j+UcCWI+FsbI5/FQP/Kj2CXyplWAz39ktHFkXk84h7dNblKRSoNJs95PZFRd96NQGqsPEPgeclqnznWZr14ZDA== + dependencies: + "@types/node" "*" + +"@types/cli-progress@^1.8.0": + version "1.8.0" + resolved "https://registry.yarnpkg.com/@types/cli-progress/-/cli-progress-1.8.0.tgz#d7cc20191efa0374b9b919531a6bee90ee223e99" + integrity sha512-anbR1K9PtAzzB7Uc577Nq5KzgLhax1AuiJp7SC029wEZTmgpOT68uKOs+LMXpvLn0aVjwOiU6ijEwkcNWT0/JA== + dependencies: + "@types/node" "*" + +"@types/clipboardy@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@types/clipboardy/-/clipboardy-1.1.0.tgz#316fe1a3ed71b1a51becb925e7e0497986c6a85c" + integrity sha512-KOxf4ah9diZWmREM5jCupx2+pZaBPwKk5d5jeNK2+TY6IgEO35uhG55NnDT4cdXeRX8irDSHQPtdRrr0JOTQIw== + +"@types/continuation-local-storage@*": + version "3.2.1" + resolved "https://registry.yarnpkg.com/@types/continuation-local-storage/-/continuation-local-storage-3.2.1.tgz#a33e0df9dce9b424d1c98fc4fdebd8578dceec7e" + integrity sha1-oz4N+dzptCTRyY/E/evYV43O7H4= + dependencies: + "@types/node" "*" + +"@types/create-hash@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@types/create-hash/-/create-hash-1.2.0.tgz#a30e091ce5904652dd6cee76d1b5e4ce6e883a68" + integrity sha512-tvo2dQ4TRKi0GYsblpWnhpJKR7Dvyyu+JdWhu4K5J8MKKONQfD9imAI/RIZn9brZXJ7n5DHxjwMpB4XOIVvGaw== + dependencies: + "@types/node" "*" + +"@types/deepmerge@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@types/deepmerge/-/deepmerge-2.2.0.tgz#6f63896c217f3164782f52d858d9f3a927139f64" + integrity sha512-FEQYDHh6+Q+QXKSrIY46m+/lAmAj/bk4KpLaam+hArmzaVpMBHLcfwOH2Q2UOkWM7XsdY9PmZpGyPAjh/JRGhQ== + dependencies: + deepmerge "*" + +"@types/elasticsearch@^5.0.29": + version "5.0.29" + resolved "https://registry.yarnpkg.com/@types/elasticsearch/-/elasticsearch-5.0.29.tgz#71acd16f978630a8bf373c2ac35869457fd914a2" + integrity sha512-bLCCbLqTh7dbsrlPsdWFt/wNg+qglHy4XJPfrf1Ls61HPm2LV5PXklc1qSz9aXnVzcpgPrKhF9f6ZOG2R4k1yQ== + "@types/events@*": version "1.2.0" resolved "https://registry.yarnpkg.com/@types/events/-/events-1.2.0.tgz#81a6731ce4df43619e5c8c945383b3e62a89ea86" integrity sha512-KEIlhXnIutzKwRbQkGWb/I4HFqBuUykAdHgDED6xqwXJfONCjF5VoE0cXEiurh3XauygxzeDzgtXUqvLkxFzzA== -"@types/fs-extra@^5.0.3": +"@types/fs-extra@^5.0.3", "@types/fs-extra@^5.0.4": version "5.0.4" resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-5.0.4.tgz#b971134d162cc0497d221adde3dbb67502225599" integrity sha512-DsknoBvD8s+RFfSGjmERJ7ZOP1HI0UZRA3FSI+Zakhrc/Gy26YQsLI+m5V5DHxroHRJqCDLKJp7Hixn8zyaF7g== dependencies: "@types/node" "*" +"@types/geojson@^1.0.0": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@types/geojson/-/geojson-1.0.6.tgz#3e02972728c69248c2af08d60a48cbb8680fffdf" + integrity sha512-Xqg/lIZMrUd0VRmSRbCAewtwGZiAk3mEUDvV4op1tGl+LvyPcb/MIOSxTl9z+9+J+R4/vpjiCAT4xeKzH9ji1w== + "@types/glob@*": version "7.1.1" resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575" @@ -1218,7 +1484,7 @@ "@types/minimatch" "*" "@types/node" "*" -"@types/handlebars@^4.0.38": +"@types/handlebars@^4.0.38", "@types/handlebars@^4.0.39": version "4.0.39" resolved "https://registry.yarnpkg.com/@types/handlebars/-/handlebars-4.0.39.tgz#961fb54db68030890942e6aeffe9f93a957807bd" integrity sha512-vjaS7Q0dVqFp85QhyPSZqDKnTTCemcSHNHFvDdalO1s0Ifz5KuE64jQD5xoUkfdWwF4WpqdJEl7LsWH8rzhKJA== @@ -1228,36 +1494,305 @@ resolved "https://registry.yarnpkg.com/@types/highlight.js/-/highlight.js-9.12.3.tgz#b672cfaac25cbbc634a0fd92c515f66faa18dbca" integrity sha512-pGF/zvYOACZ/gLGWdQH8zSwteQS1epp68yRcVLJMgUck/MjEn/FBYmPub9pXT8C1e4a8YZfHo1CKyV8q1vKUnQ== +"@types/hoek@^4.1.3": + version "4.1.3" + resolved "https://registry.yarnpkg.com/@types/hoek/-/hoek-4.1.3.tgz#d1982d48fb0d2a0e5d7e9d91838264d8e428d337" + integrity sha1-0ZgtSPsNKg5dfp2Rg4Jk2OQo0zc= + +"@types/integer@*": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/integer/-/integer-1.0.0.tgz#f5b313876012fad0afeb5318f03cb871064eb33e" + integrity sha512-3viiRKLoSP2Qr78nMoQjkDc0fan4BgmpOyV1+1gKjE8wWXo3QQ78WItO6f9WuBf3qe3ymDYhM65oqHTOZ0rFxw== + "@types/jest@^23.3.10": version "23.3.10" resolved "https://registry.yarnpkg.com/@types/jest/-/jest-23.3.10.tgz#4897974cc317bf99d4fe6af1efa15957fa9c94de" integrity sha512-DC8xTuW/6TYgvEg3HEXS7cu9OijFqprVDXXiOcdOKZCU/5PJNLZU37VVvmZHdtMiGOa8wAA/We+JzbdxFzQTRQ== -"@types/lodash@^4.14.110": +"@types/joi@^14.0.0": + version "14.0.1" + resolved "https://registry.yarnpkg.com/@types/joi/-/joi-14.0.1.tgz#739be8a8899a75631a3c9f15611e54bbab06c024" + integrity sha512-0uZZ+nffpr480zwwUXsk0Z5O0szllffNW1EbkI+dDzKhNKhiX4QOwpwK37WpKIpaPLk9V8U9y2We/VOeD6zyhQ== + +"@types/keyv@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.0.1.tgz#360353aba0fcc8db2c857685d3b31b42d4602b5c" + integrity sha512-Nn9TebKwLyY17j7arUL1yKYS5Mx+I1h45bejs/C9g8LW1Km7CrJbMHmm96cSsxslOAk1CnQj614gF9ekMnH1Lg== + dependencies: + "@types/node" "*" + +"@types/lodash.camelcase@^4.3.4": + version "4.3.4" + resolved "https://registry.yarnpkg.com/@types/lodash.camelcase/-/lodash.camelcase-4.3.4.tgz#bdc60ff98f7727787d9ea593e398a3e9bf9f6180" + integrity sha512-yx+TmSP3QnhUGdcxkvwV3O++eI6kXKf5E89yJutHR8ebdr5f7KF5XmTBIWrbXFBLo2JIcaBz2axdpe7/WiOT2g== + dependencies: + "@types/lodash" "*" + +"@types/lodash.chunk@^4.2.4": + version "4.2.4" + resolved "https://registry.yarnpkg.com/@types/lodash.chunk/-/lodash.chunk-4.2.4.tgz#d0301e7ed435f7eb60c570e715fb05047256d536" + integrity sha512-8/M4C4g2xIKCZb6B66J3pQrcdGgAEb9O8gZrYULJ7dI3BDOFLm5bzrg+K4u5MogGqx3K19rJoy1BnJ0KNQvMBA== + dependencies: + "@types/lodash" "*" + +"@types/lodash.clonedeep@^4.5.4": + version "4.5.4" + resolved "https://registry.yarnpkg.com/@types/lodash.clonedeep/-/lodash.clonedeep-4.5.4.tgz#2515c5f08bc95afebfb597711871b0497f5d7da7" + integrity sha512-+rCVPIZOJaub++wU/lmyp/SxiKlqXQaXI5LryzjuHBKFj51ApVt38Xxk9psLWNGMuR/obEQNTH0l/yDfG4ANNQ== + dependencies: + "@types/lodash" "*" + +"@types/lodash.clonedeepwith@^4.5.4": + version "4.5.4" + resolved "https://registry.yarnpkg.com/@types/lodash.clonedeepwith/-/lodash.clonedeepwith-4.5.4.tgz#d731f56054cc8f69791a0026cef239a2037becb5" + integrity sha512-XSvQmZqThGjllaulK0Ovy8eEk2Ok41eqVZ1NY/sA/xQxmYI8xb187xToMDkPbK2rTiQGG45ThdIzWGWlC0xNog== + dependencies: + "@types/lodash" "*" + +"@types/lodash.compact@^3.0.4": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/lodash.compact/-/lodash.compact-3.0.4.tgz#f5eb5b34fa19521029febf27b8eca0a6689c2384" + integrity sha512-oHZH8dWjSJHIstoGL7ZKtZ87UP7Diz9SXKAFLh19JZaEkdxhld89vg+XykjMzdR0mfcZWF5mWOrco+SKG+uXtg== + dependencies: + "@types/lodash" "*" + +"@types/lodash.fill@^3.4.4": + version "3.4.4" + resolved "https://registry.yarnpkg.com/@types/lodash.fill/-/lodash.fill-3.4.4.tgz#c54608d7da691142bf281134149b6ecf0d1f701b" + integrity sha512-D2c164uS5YG3OYmalDFW3yXlhq3DmFE8y1EdQ9MqQ9VPFBD9+73GMzZxRAdG4/G8O3ZNeERkRGXMJCgsWi7c6A== + dependencies: + "@types/lodash" "*" + +"@types/lodash.first@^3.0.4": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/lodash.first/-/lodash.first-3.0.4.tgz#39c95a74f4a00a97fa3afb4d1655b6996eac79e5" + integrity sha512-ApNt+FXI8YNZr11ae/dfl1C121SflvsT2uc602E76ZfZDyQJg5Uiy7oS+t+m1Zf36VghWxsMzjYor11qDdq/cg== + dependencies: + "@types/lodash" "*" + +"@types/lodash.flatten@^4.4.4": + version "4.4.4" + resolved "https://registry.yarnpkg.com/@types/lodash.flatten/-/lodash.flatten-4.4.4.tgz#7f28009ef57c8d2b1d8463c3e53fdccf780120a5" + integrity sha512-F106FV2hmztEtMHozFMfS41u+58vjMEv2SJljMlXmPCn13yWS+/B1r0KjQuaZpsPE857req0BunDwzgpqQ2Ydg== + dependencies: + "@types/lodash" "*" + +"@types/lodash.get@^4.4.4": + version "4.4.4" + resolved "https://registry.yarnpkg.com/@types/lodash.get/-/lodash.get-4.4.4.tgz#34b67841594e4ddc8853341d65e971a38cb4e2f0" + integrity sha512-6igkhtKoWAEvTWCgd5uubiuxXLUY/kljQOQZV1G5Y7SrivpmCU+NWG5tGLgRBkccobrDljbJYzBM2vgCG4Oc8Q== + dependencies: + "@types/lodash" "*" + +"@types/lodash.groupby@^4.6.4": + version "4.6.4" + resolved "https://registry.yarnpkg.com/@types/lodash.groupby/-/lodash.groupby-4.6.4.tgz#4dbb730b0a8ad46915b7406d1e247cfd7a79b288" + integrity sha512-WvjZ0XtKdNUNGwY0udB3DiP3PC4mW6L3ESkJudA+LsgB2+LCUXUu3Pa+idzenLqBbMOcbBeAWPmEWSvyH0VWjw== + dependencies: + "@types/lodash" "*" + +"@types/lodash.head@^4.0.4": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@types/lodash.head/-/lodash.head-4.0.4.tgz#1e788bad0435d31c06cbefe8781dc368be756d49" + integrity sha512-Tngbn0PblpxwEljuFWJ+CK1hp4GMDjtoJtQjpz0JLJ/7u4eNA3Wemu0e+mNPPqtlrFMoY8eFKEPQ5OX6/K5q6g== + dependencies: + "@types/lodash" "*" + +"@types/lodash.isempty@^4.4.4": + version "4.4.4" + resolved "https://registry.yarnpkg.com/@types/lodash.isempty/-/lodash.isempty-4.4.4.tgz#0748feefeb1d639017bb76f155d7e402ca3e3cdf" + integrity sha512-d0pn1toi559K94bpy1/Huv82xZWhEHpump1nrhToZ+CDZizEZ9hBx8J+pT4aUbnBtyeGdEMyWqknQOIIie83NA== + dependencies: + "@types/lodash" "*" + +"@types/lodash.isequal@^4.5.3": + version "4.5.3" + resolved "https://registry.yarnpkg.com/@types/lodash.isequal/-/lodash.isequal-4.5.3.tgz#b0d2747d3e76cc94da47ebd932c69a98c0ba61b4" + integrity sha512-tpTUmHksO2H9RF98Y2w7v06ZeEKAxHPo2ysL0bV5qv5UBweiZl33NFu5QYmYOSxSnHMqBt/vsVsBVeQAcJiokg== + dependencies: + "@types/lodash" "*" + +"@types/lodash.isstring@^4.0.4": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@types/lodash.isstring/-/lodash.isstring-4.0.4.tgz#d049735cd098c39227a9974068b61c874ac107bc" + integrity sha512-kdDz6h18L4H8Stbrm0S3uKADdtMJsq+7+AmqsMtZ5h0fi+6gSpphe8qQHJBeeGtz8EFzz+8pyIBLAxuvmCInww== + dependencies: + "@types/lodash" "*" + +"@types/lodash.last@^3.0.4": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/lodash.last/-/lodash.last-3.0.4.tgz#7c3dcd6be9de2a5517614e8cca604d0ef2a6c73a" + integrity sha512-G/5M4Uek3v41lYgq8qLuvfWVbm8iwsHgFLw+jFVOyRF3PT5GqSwtQSMviONiNqT1CymdZV8HSh2tw8wfv0eVmA== + dependencies: + "@types/lodash" "*" + +"@types/lodash.orderby@^4.6.4": + version "4.6.4" + resolved "https://registry.yarnpkg.com/@types/lodash.orderby/-/lodash.orderby-4.6.4.tgz#adea1ffe3d5c33ae13b137ca1685f267a6b50f14" + integrity sha512-zOdkK4xTzEfwXH2ffwIMAJbZ2CeCKs6egg+xr/TWJttHAEccvEH/qX/mbRnTHWTqBZsXPHUpOHfXo2l2lMDKUQ== + dependencies: + "@types/lodash" "*" + +"@types/lodash.pick@^4.4.4": + version "4.4.4" + resolved "https://registry.yarnpkg.com/@types/lodash.pick/-/lodash.pick-4.4.4.tgz#381ac6c0a92f50405e2a6f9caeff07b0e40a9f75" + integrity sha512-54nf0ndJlN3ULz9fLceKhYJZfwf50jAqqPJyI3/UbU/qxyuMSgNC3niWhFqmVAnGPoxMwAwNQCYTXG0Gv2lfPg== + dependencies: + "@types/lodash" "*" + +"@types/lodash.sample@^4.2.4": + version "4.2.4" + resolved "https://registry.yarnpkg.com/@types/lodash.sample/-/lodash.sample-4.2.4.tgz#d979476e1b5b05781adad5185027cd286bf4e963" + integrity sha512-6TFpHgqLDu8Dmpn6xfzzjKC/25leqA1sV3CJt7LbXrLCkbnaSGaax3WKacvllaS3FOdBocVLgXU/nVqdKERl9A== + dependencies: + "@types/lodash" "*" + +"@types/lodash.set@^4.3.4": + version "4.3.4" + resolved "https://registry.yarnpkg.com/@types/lodash.set/-/lodash.set-4.3.4.tgz#ef11a971c7d3858e74fa6f745b4b69b2256f6c07" + integrity sha512-oY+y8V6Bg69q4U4eDhR7K177gE76I2Zb40OMHb+epTwo6RMGXeJpY7sKN7xrzvr1aXxPsfS50pvKVlcRq34JPQ== + dependencies: + "@types/lodash" "*" + +"@types/lodash.shuffle@^4.2.4": + version "4.2.4" + resolved "https://registry.yarnpkg.com/@types/lodash.shuffle/-/lodash.shuffle-4.2.4.tgz#3931aeafe65770c132e3a4061c833eaf5936c2b2" + integrity sha512-GnqZmVNNRDbDTzaFOf5TaumjlN+Nq83+kTSnU1EsTo6NtKlifBKU0oNM2wsL3BAxMWk4E6WVtzoBu+2Vg7RIjw== + dependencies: + "@types/lodash" "*" + +"@types/lodash.snakecase@^4.1.4": + version "4.1.4" + resolved "https://registry.yarnpkg.com/@types/lodash.snakecase/-/lodash.snakecase-4.1.4.tgz#58729021e111db6a4ff814d3ff16ac13ef7d0132" + integrity sha512-cC7ebPwSRw3hvBBfB6AV2Aja/XsIxL1HkwKjgDoQPZWjQlNtkkpFCGF7wxGaHMYsEaoUrnX1RE0FZW5Zzacr9Q== + dependencies: + "@types/lodash" "*" + +"@types/lodash.sortby@^4.7.4": + version "4.7.4" + resolved "https://registry.yarnpkg.com/@types/lodash.sortby/-/lodash.sortby-4.7.4.tgz#14f9d45b6214b32cbe2f6332990b386d4b2dd09a" + integrity sha512-Byy/JXUl7VCKOjqk2XyOEa4kRp2UBuPPkdQpIwSi+54t3KDa1vkIRU+qFEoWZMLcMUbBq8+Iy8Ybri8AqFYLTA== + dependencies: + "@types/lodash" "*" + +"@types/lodash.sumby@^4.6.4": + version "4.6.4" + resolved "https://registry.yarnpkg.com/@types/lodash.sumby/-/lodash.sumby-4.6.4.tgz#169974c2e54a24ce3f27ee785f1969abe6d8e385" + integrity sha512-CY7N49UIPO7CdArz5Kj3IyQKpZbXcnP4tVqQgL6+qDsd9jmcukqEmyD4weyxBUxXH3EvEmIYoBQjA8loAi266Q== + dependencies: + "@types/lodash" "*" + +"@types/lodash.take@^4.1.4": + version "4.1.4" + resolved "https://registry.yarnpkg.com/@types/lodash.take/-/lodash.take-4.1.4.tgz#07e5670ac15501fcfccb4d0a4dd81ef87b239bb3" + integrity sha512-kGCIqpisGQs8x0dB5Usd6+7lL1pGgUThD9HlpJXS+xdTAE075HpqHBdl9YAezBKEWyx7F9qFR076eclld9QRhQ== + dependencies: + "@types/lodash" "*" + +"@types/lodash.uniq@^4.5.4": + version "4.5.4" + resolved "https://registry.yarnpkg.com/@types/lodash.uniq/-/lodash.uniq-4.5.4.tgz#8dd571e4a68adddcd1bac810538e68f440e87403" + integrity sha512-q0FI7RCY99bUPBR7sJyfefWDa/KSD21pMWM1hi+2O+rJTzY2N4eRs+A6BwLotPNy/JOySfcZJYamZ8Owcs3SkQ== + dependencies: + "@types/lodash" "*" + +"@types/lodash@*", "@types/lodash@^4.14.110": version "4.14.119" resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.119.tgz#be847e5f4bc3e35e46d041c394ead8b603ad8b39" integrity sha512-Z3TNyBL8Vd/M9D9Ms2S3LmFq2sSMzahodD6rCS9V2N44HUMINb75jNkSuwAx7eo2ufqTdfOdtGQpNbieUjPQmw== +"@types/long@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.0.tgz#719551d2352d301ac8b81db732acb6bdc28dbdef" + integrity sha512-1w52Nyx4Gq47uuu0EVcsHBxZFJgurQ+rTKS3qMHxR1GY2T8c2AJYd6vZoZ9q1rupaDjU0yT+Jc2XTyXkjeMA+Q== + "@types/marked@^0.4.0": version "0.4.2" resolved "https://registry.yarnpkg.com/@types/marked/-/marked-0.4.2.tgz#64a89e53ea37f61cc0f3ee1732c555c2dbf6452f" integrity sha512-cDB930/7MbzaGF6U3IwSQp6XBru8xWajF5PV2YZZeV8DyiliTuld11afVztGI9+yJZ29il5E+NpGA6ooV/Cjkg== +"@types/micromatch@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@types/micromatch/-/micromatch-3.1.0.tgz#514c8a3d24b2680a9b838eeb80e6d7d724545433" + integrity sha512-06uA9V7v68RTOzA3ky1Oi0HmCPa+YJ050vM+sTECwkxnHUQnO17TAcNCGX400QT6bldUiPb7ux5oKy0j8ccEDw== + dependencies: + "@types/braces" "*" + "@types/minimatch@*", "@types/minimatch@3.0.3": version "3.0.3" resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== +"@types/mongodb@*": + version "3.1.17" + resolved "https://registry.yarnpkg.com/@types/mongodb/-/mongodb-3.1.17.tgz#11351b147b68e7674cff9055ea82072521bc6fe3" + integrity sha512-u6tSIpfdsgK74aE0TuyqZYhHscw+gHs6dQNSsFUTFXubhhxCqovmV3nJRS0YKSw0sfqbzUgGzbG5+yorUPRnFg== + dependencies: + "@types/bson" "*" + "@types/node" "*" + +"@types/msgpack-lite@^0.1.6": + version "0.1.6" + resolved "https://registry.yarnpkg.com/@types/msgpack-lite/-/msgpack-lite-0.1.6.tgz#27e2a7eea4514f084ed4f9b53f8f63e6db4d6d50" + integrity sha512-Y9GFyM8qt5p7p+HtM9rsSAnle4ZmcpNAhbaFQyj1XzaHgEVCYgRNJiCeGxf5Jf81/a/G1o+LuGDE3mvLosU2MA== + dependencies: + "@types/node" "*" + "@types/node@*", "@types/node@^10.12.12": version "10.12.12" resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.12.tgz#e15a9d034d9210f00320ef718a50c4a799417c47" integrity sha512-Pr+6JRiKkfsFvmU/LK68oBRCQeEg36TyAbPhc2xpez24OOZZCuoIhWGTd39VZy6nGafSbxzGouFPTFD/rR1A0A== +"@types/node@^10.1.0": + version "10.12.15" + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.15.tgz#20e85651b62fd86656e57c9c9bc771ab1570bc59" + integrity sha512-9kROxduaN98QghwwHmxXO2Xz3MaWf+I1sLVAA6KJDF5xix+IyXVhds0MAfdNwtcpSrzhaTsNB0/jnL86fgUhqA== + +"@types/otplib@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@types/otplib/-/otplib-7.0.0.tgz#bc608c8771cba0f4417478eef79ef3f79c47e9f6" + integrity sha512-OZFn1eVNRGpaCfVZhTCIeSlHfxXM1oe1qtu9w07hWfH4nHiDo+tI6b6pIrOCNKQN9gYOP2M4Q43YvkT1R50deA== + +"@types/pino@^5.8.3": + version "5.8.3" + resolved "https://registry.yarnpkg.com/@types/pino/-/pino-5.8.3.tgz#cd355c97a92d57927fe67ee5c7d1fa9349280805" + integrity sha512-dpHLhkuV1QNHC6SOnjSn75MeA0L9CGIWWp+axhm2JwgrYiViomUJF5tELWvGopKPrGXhggHAQv1Q5vkBapy6/w== + dependencies: + "@types/node" "*" + "@types/sonic-boom" "*" + +"@types/pluralize@^0.0.29": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/pluralize/-/pluralize-0.0.29.tgz#6ffa33ed1fc8813c469b859681d09707eb40d03c" + integrity sha512-BYOID+l2Aco2nBik+iYS4SZX0Lf20KPILP5RGmM1IgzdwNdTs0eebiFriOPcej1sX9mLnSoiNte5zcFxssgpGA== + "@types/pretty-ms@^4.0.0": version "4.0.0" resolved "https://registry.yarnpkg.com/@types/pretty-ms/-/pretty-ms-4.0.0.tgz#5e5177b9e447fbc8446e6fd2b09aea045971f11d" integrity sha512-l5aIszYIm3s4jIL4wLDwajEml1w3E4zqGDDUgvnroX1ux6YAxsCrgRHLUafgrHFGTHlx7TpwiwSwcHV8IBvccw== +"@types/secp256k1@^3.5.0": + version "3.5.0" + resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-3.5.0.tgz#0f3baf16b07488c6da2633a63b4160bcf8d0fd5b" + integrity sha512-ZE39QhkIaNK6xbKIp1VLN5O36r97LuslLmRnjAcT0sVDxcfvrk3zqp/VnIfmGza7J6jDxR8dIai3hsCxPYglPA== + dependencies: + "@types/node" "*" + +"@types/semver@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-5.5.0.tgz#146c2a29ee7d3bae4bf2fcb274636e264c813c45" + integrity sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ== + +"@types/sequelize@*", "@types/sequelize@^4.27.33": + version "4.27.33" + resolved "https://registry.yarnpkg.com/@types/sequelize/-/sequelize-4.27.33.tgz#1e906565f371c7efbda0bf2bfa322bea4b5bb1a2" + integrity sha512-4w36T30hQKtsVj3BWktRauAls+amAkJsjn6EdQBQ5Pq5iiMm2qRgdFsQj/OHYM1LCYtH7eR4/g4ffbmFux1q2A== + dependencies: + "@types/bluebird" "*" + "@types/continuation-local-storage" "*" + "@types/lodash" "*" + "@types/validator" "*" + "@types/shelljs@^0.8.0": version "0.8.1" resolved "https://registry.yarnpkg.com/@types/shelljs/-/shelljs-0.8.1.tgz#133e874b5fb816a2e1c8647839c82d76760b1191" @@ -1266,6 +1801,62 @@ "@types/glob" "*" "@types/node" "*" +"@types/sonic-boom@*": + version "0.6.1" + resolved "https://registry.yarnpkg.com/@types/sonic-boom/-/sonic-boom-0.6.1.tgz#530d17e0b971c8f41cdfd78206171155aee58795" + integrity sha512-I0LVjE/VPehYvvMgmLZ8kSutqCaGzwDbyf74C5zoNwsb64KCppCJ7GkrLC4Sic3SzfEsGhcAVFpxR7UEpDi+bg== + dependencies: + "@types/node" "*" + +"@types/sqlite3@^3.1.3": + version "3.1.3" + resolved "https://registry.yarnpkg.com/@types/sqlite3/-/sqlite3-3.1.3.tgz#580d547203b8ad6e11aa6a6769c8ca5d7e197d13" + integrity sha512-BgGToABnI/8/HnZtZz2Qac6DieU2Dm/j3rtbMmUlDVo4T/uLu8cuVfU/n2UkHowiiwXb6/7h/CmSqBIVKgcTMA== + dependencies: + "@types/events" "*" + "@types/node" "*" + +"@types/stack-trace@0.0.29": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/stack-trace/-/stack-trace-0.0.29.tgz#eb7a7c60098edb35630ed900742a5ecb20cfcb4d" + integrity sha512-TgfOX+mGY/NyNxJLIbDWrO9DjGoVSW9+aB8H2yy1fy32jsvxijhmyJI9fDFgvz3YP4lvJaq9DzdR/M1bOgVc9g== + +"@types/umzug@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@types/umzug/-/umzug-2.2.0.tgz#0cfc694dd70cf20c0386bddc76d53fe225ae1c67" + integrity sha512-p9yaOdoKRYT8MuLOGKigzOFKaIrd6v6OwcfUEEGNiLYWldf1dLgoZ74e0vuo9/tpIuww9LuoqfJFEEslj4Z7Ng== + dependencies: + "@types/events" "*" + "@types/mongodb" "*" + "@types/sequelize" "*" + +"@types/uuid@^3.4.4": + version "3.4.4" + resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-3.4.4.tgz#7af69360fa65ef0decb41fd150bf4ca5c0cefdf5" + integrity sha512-tPIgT0GUmdJQNSHxp0X2jnpQfBSTfGxUMc/2CXBU2mnyTFVYVa2ojpoQ74w0U2yn2vw3jnC640+77lkFFpdVDw== + dependencies: + "@types/node" "*" + +"@types/validator@*": + version "9.4.4" + resolved "https://registry.yarnpkg.com/@types/validator/-/validator-9.4.4.tgz#67c745e988f721ea2a1e4cc5b4cd76e6bb3a76b1" + integrity sha512-7bWNKQ3lDMhRS2lxe1aHGTBijZ/a6wQfZmCtKJDefpb81sYd+FrfNqj6Gda1Tcw8bYK0gG1CVuNLWV2JS7K8Dw== + +"@types/wif@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@types/wif/-/wif-2.0.1.tgz#bcab48b201403cb759cd7659aff4610cfd4888f4" + integrity sha512-FQKvE4EncC8C4qxW9y0psAOs2XVkxSAGIofB8tqNDPSeOsR4OueEf9TED3PHf8xlOquI+m++AXTWjJIS07FNHw== + dependencies: + "@types/node" "*" + +"@types/ws@^6.0.0": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-6.0.1.tgz#ca7a3f3756aa12f62a0a62145ed14c6db25d5a28" + integrity sha512-EzH8k1gyZ4xih/MaZTXwT2xOkPiIMSrhQ9b8wrlX88L0T02eYsddatQlwVFlEPyEqV0ChpdpNnE51QPH6NVT4Q== + dependencies: + "@types/events" "*" + "@types/node" "*" + "@webassemblyjs/ast@1.7.11": version "1.7.11" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.7.11.tgz#b988582cafbb2b095e8b556526f30c90d057cace" @@ -1424,7 +2015,7 @@ resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== -JSONStream@^1.0.4, JSONStream@^1.3.4: +JSONStream@^1.0.4, JSONStream@^1.3.4, JSONStream@^1.3.5: version "1.3.5" resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== @@ -1447,6 +2038,14 @@ abbrev@~1.0.9: resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" integrity sha1-kbR5JYinc4wl813W9jdSovh3YTU= +accept@3.x.x, accept@^3.0.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/accept/-/accept-3.1.3.tgz#29c3e2b3a8f4eedbc2b690e472b9ebbdc7385e87" + integrity sha512-OgOEAidVEOKPup+Gv2+2wdH2AgVKI9LxsJ4hicdJ6cY0faUuZdZoi56kkXWlHp9qicN1nWQLmW5ZRGk+SBS5xg== + dependencies: + boom "7.x.x" + hoek "6.x.x" + accepts@~1.3.5: version "1.3.5" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2" @@ -1499,6 +2098,14 @@ agentkeepalive@^3.4.1: dependencies: humanize-ms "^1.2.1" +aggregate-error@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-1.0.0.tgz#888344dad0220a72e3af50906117f48771925fac" + integrity sha1-iINE2tAiCnLjr1CQYRf0h3GSX6w= + dependencies: + clean-stack "^1.0.0" + indent-string "^3.0.0" + ajv-errors@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" @@ -1519,6 +2126,21 @@ ajv@^6.1.0, ajv@^6.5.5: json-schema-traverse "^0.4.1" uri-js "^4.2.2" +ambi@^2.4.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/ambi/-/ambi-2.5.0.tgz#7c8e372be48891157e7cea01cb6f9143d1f74220" + integrity sha1-fI43K+SIkRV+fOoBy2+RQ9H3QiA= + dependencies: + editions "^1.1.1" + typechecker "^4.3.0" + +ammo@3.x.x: + version "3.0.3" + resolved "https://registry.yarnpkg.com/ammo/-/ammo-3.0.3.tgz#502aafa9d8bfca264143e226e5f322716e746b0c" + integrity sha512-vo76VJ44MkUBZL/BzpGXaKzMfroF4ZR6+haRuw9p+eSWfoNaH2AxVc8xmiEPC08jhzJSeM6w7/iMUGet8b4oBQ== + dependencies: + hoek "6.x.x" + ansi-align@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" @@ -1581,6 +2203,134 @@ anymatch@^2.0.0: micromatch "^3.1.4" normalize-path "^2.1.1" +apollo-cache-control@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/apollo-cache-control/-/apollo-cache-control-0.4.0.tgz#fec343e6ec95aa4f1b88e07e62f067bee0c48397" + integrity sha512-WuriaNQIugTE8gYwfBWWCbbQTSKul/cV4JMi5UgqNIUvjHvnKZQLKbt5uYWow6QQNMkLT9hey8QPYkWpogkeSA== + dependencies: + apollo-server-env "2.2.0" + graphql-extensions "0.4.0" + +apollo-datasource@0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/apollo-datasource/-/apollo-datasource-0.2.1.tgz#3ecef4efe64f7a04a43862f32027d38ac09e142c" + integrity sha512-r185+JTa5KuF1INeTAk7AEP76zwMN6c8Ph1lmpzJMNwBUEzTGnLClrccCskCBx4SxfnkdKbuQdwn9JwCJUWrdg== + dependencies: + apollo-server-caching "0.2.1" + apollo-server-env "2.2.0" + +apollo-engine-reporting-protobuf@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/apollo-engine-reporting-protobuf/-/apollo-engine-reporting-protobuf-0.2.0.tgz#2aaf4d2eddefe7924d469cf1135267bc0deadf73" + integrity sha512-qI+GJKN78UMJ9Aq/ORdiM2qymZ5yswem+/VDdVFocq+/e1QqxjnpKjQWISkswci5+WtpJl9SpHBNxG98uHDKkA== + dependencies: + protobufjs "^6.8.6" + +apollo-engine-reporting@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/apollo-engine-reporting/-/apollo-engine-reporting-0.2.0.tgz#e71816b1f46e782f8538c5a118148d4c0e628e25" + integrity sha512-Q6FfVb10v/nrv8FaFsPjIYlWh62jaYav3LuMgM9PsHWGK/zRQFXOEwLxcY2UCvG7O1moxF3XGmfBhMgo54py+Q== + dependencies: + apollo-engine-reporting-protobuf "0.2.0" + apollo-server-env "2.2.0" + async-retry "^1.2.1" + graphql-extensions "0.4.0" + lodash "^4.17.10" + +apollo-env@0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/apollo-env/-/apollo-env-0.2.5.tgz#162c785bccd2aea69350a7600fab4b7147fc9da5" + integrity sha512-Gc7TEbwCl7jJVutnn8TWfzNSkrrqyoo0DP92BQJFU9pZbJhpidoXf2Sw1YwOJl82rRKH3ujM3C8vdZLOgpFcFA== + dependencies: + core-js "^3.0.0-beta.3" + node-fetch "^2.2.0" + +apollo-link@^1.2.3: + version "1.2.6" + resolved "https://registry.yarnpkg.com/apollo-link/-/apollo-link-1.2.6.tgz#d9b5676d79c01eb4e424b95c7171697f6ad2b8da" + integrity sha512-sUNlA20nqIF3gG3F8eyMD+mO80fmf3dPZX+GUOs3MI9oZR8ug09H3F0UsWJMcpEg6h55Yy5wZ+BMmAjrbenF/Q== + dependencies: + apollo-utilities "^1.0.0" + zen-observable-ts "^0.8.13" + +apollo-server-caching@0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/apollo-server-caching/-/apollo-server-caching-0.2.1.tgz#7e67f8c8cac829e622b394f0fb82579cabbeadfd" + integrity sha512-+U9F3X297LL8Gqy6ypfDNEv/DfV/tDht9Dr2z3AMaEkNW1bwO6rmdDL01zYxDuVDVq6Z3qSiNCSO2pXE2F0zmA== + dependencies: + lru-cache "^5.0.0" + +apollo-server-core@2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/apollo-server-core/-/apollo-server-core-2.3.1.tgz#cbdc0020a0dfecf2220cf5062dbb304fdf56edf2" + integrity sha512-8jMWYOQIZi9mDJlHe2rXg8Cp4xKYogeRu23jkcNy+k5UjZL+eO+kHXbNFiTaP4HLYYEpe2XE3asxp6q5YUEQeQ== + dependencies: + "@apollographql/apollo-tools" "^0.2.6" + "@apollographql/graphql-playground-html" "^1.6.6" + "@types/ws" "^6.0.0" + apollo-cache-control "0.4.0" + apollo-datasource "0.2.1" + apollo-engine-reporting "0.2.0" + apollo-server-caching "0.2.1" + apollo-server-env "2.2.0" + apollo-server-errors "2.2.0" + apollo-server-plugin-base "0.2.1" + apollo-tracing "0.4.0" + graphql-extensions "0.4.1" + graphql-subscriptions "^1.0.0" + graphql-tag "^2.9.2" + graphql-tools "^4.0.0" + graphql-upload "^8.0.2" + json-stable-stringify "^1.0.1" + lodash "^4.17.10" + subscriptions-transport-ws "^0.9.11" + ws "^6.0.0" + +apollo-server-env@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/apollo-server-env/-/apollo-server-env-2.2.0.tgz#5eec5dbf46581f663fd6692b2e05c7e8ae6d6034" + integrity sha512-wjJiI5nQWPBpNmpiLP389Ezpstp71szS6DHAeTgYLb/ulCw3CTuuA+0/E1bsThVWiQaDeHZE0sE3yI8q2zrYiA== + dependencies: + node-fetch "^2.1.2" + util.promisify "^1.0.0" + +apollo-server-errors@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/apollo-server-errors/-/apollo-server-errors-2.2.0.tgz#5b452a1d6ff76440eb0f127511dc58031a8f3cb5" + integrity sha512-gV9EZG2tovFtT1cLuCTavnJu2DaKxnXPRNGSTo+SDI6IAk6cdzyW0Gje5N2+3LybI0Wq5KAbW6VLei31S4MWmg== + +apollo-server-hapi@^2.2.4: + version "2.3.1" + resolved "https://registry.yarnpkg.com/apollo-server-hapi/-/apollo-server-hapi-2.3.1.tgz#f0614884a06c5fecd436b16e7472ae31063cf399" + integrity sha512-FGkKrm27L2l4DyNX2FLaedsZeK2u2WE8IS66FTI00HdOXeTeq0W4z2pq1H2+kDMQmcxuALHVv3J4VbExIYCa2A== + dependencies: + "@apollographql/graphql-playground-html" "^1.6.6" + accept "^3.0.2" + apollo-server-core "2.3.1" + boom "^7.1.0" + graphql-subscriptions "^1.0.0" + graphql-tools "^4.0.0" + +apollo-server-plugin-base@0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/apollo-server-plugin-base/-/apollo-server-plugin-base-0.2.1.tgz#d08c9576f7f11ab6e212f352d482faaa4059a31e" + integrity sha512-497NIY9VWRYCrMSkgR11IrIUO4Fsy6aGgnpOJoTdLQAnkDD9SJDSRzwKj4gypUoTT2unfKDng4eMxXVZlHvjOw== + +apollo-tracing@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/apollo-tracing/-/apollo-tracing-0.4.0.tgz#4b939063f4292422ac5a3564b76d1d88dec0a916" + integrity sha512-BlM8iQUQva4fm0xD/pLwkcz0degfB9a/aAn4k4cK36eLVD8XUkl7ptEB0c+cwcj7tOYpV1r5QX1XwdayBzlHSg== + dependencies: + apollo-server-env "2.2.0" + graphql-extensions "0.4.0" + +apollo-utilities@^1.0.0, apollo-utilities@^1.0.1: + version "1.0.26" + resolved "https://registry.yarnpkg.com/apollo-utilities/-/apollo-utilities-1.0.26.tgz#589c66bf4d16223531351cf667a230c787def1da" + integrity sha512-URw7o3phymliqYCYatcird2YRPUU2eWCNvip64U9gQrX56mEfK4m99yBIDCMTpmcvOFsKLii1sIEZsHIs/bvnw== + dependencies: + fast-json-stable-stringify "^2.0.0" + append-transform@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-0.4.0.tgz#d76ebf8ca94d276e247a36bad44a4b74ab611991" @@ -1603,6 +2353,11 @@ aproba@~1.0.4: resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.0.4.tgz#2713680775e7614c8ba186c065d4e2e52d1072c0" integrity sha1-JxNoB3XnYUyLoYbAZdTi5S0QcsA= +arch@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/arch/-/arch-2.1.1.tgz#8f5c2731aa35a30929221bb0640eed65175ec84e" + integrity sha512-BLM56aPo9vLLFVa8+/+pJLnrZ7QGGTVHWsCwieAWT9o9K8UeGaQbzZbGoabWLOo2ksBCztoXdqBZBplqLDDCSg== + archy@^1.0.0, archy@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" @@ -1616,6 +2371,14 @@ are-we-there-yet@~1.1.2: delegates "^1.0.0" readable-stream "^2.0.6" +argle@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/argle/-/argle-1.1.1.tgz#0cfe3bc032c36b2f48ba42b9c17f89f70607e994" + integrity sha1-DP47wDLDay9IukK5wX+J9wYH6ZQ= + dependencies: + lodash.isfunction "^3.0.8" + lodash.isnumber "^3.0.3" + argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" @@ -1623,6 +2386,16 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" +args@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/args/-/args-5.0.0.tgz#8a3e376f28550f9fbdfefcb097179f2f75848efe" + integrity sha512-eCZo33yLdQ3DiG/Ko5n11uPonyYofYd9F2cqWID8TKGZwK/Z2ZcUj/oZ1HNMeNL2lgraPnv3JBZumfbUMqmZtg== + dependencies: + camelcase "5.0.0" + chalk "2.4.1" + leven "2.1.0" + mri "1.1.1" + argv@^0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/argv/-/argv-0.0.2.tgz#ecbd16f8949b157183711b1bda334f37840185ab" @@ -1690,6 +2463,11 @@ array-union@^1.0.1: dependencies: array-uniq "^1.0.1" +array-uniq@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.2.tgz#5fcc373920775723cfd64d65c64bef53bf9eba6d" + integrity sha1-X8w3OSB3VyPP1k1lxkvvU7+eum0= + array-uniq@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" @@ -1773,12 +2551,19 @@ async-limiter@~1.0.0: resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" integrity sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg== +async-retry@^1.2.1: + version "1.2.3" + resolved "https://registry.yarnpkg.com/async-retry/-/async-retry-1.2.3.tgz#a6521f338358d322b1a0012b79030c6f411d1ce0" + integrity sha512-tfDb02Th6CE6pJUF2gjW5ZVjsgwlucVXOEQMvEX9JgSJMs9gAX+Nz3xRuJBKuUYjTSYORqvDBORdAQ3LU59g7Q== + dependencies: + retry "0.12.0" + async@^1.4.0, async@~1.5: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= -async@^2.1.4, async@^2.5.0: +async@^2.1.4, async@^2.5.0, async@^2.6.0, async@^2.6.1: version "2.6.1" resolved "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610" integrity sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ== @@ -1795,6 +2580,14 @@ atob@^2.1.1: resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== +awilix@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/awilix/-/awilix-4.0.1.tgz#c858c1d0f45851a69ce2e77f18f85ec4cb57a8f9" + integrity sha512-PYISyECR2xK+ThMSVu319pUGLkhJc/HLnk1+YNsQHQ12yhTcrhkqclPIqM7xGNgr0HNbbyoQSJZ42jd5br0cuA== + dependencies: + camel-case "^3.0.0" + glob "^7.1.3" + aws-sign2@~0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" @@ -1810,6 +2603,13 @@ aws4@^1.2.1, aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== +axios-mock-adapter@^1.15.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/axios-mock-adapter/-/axios-mock-adapter-1.15.0.tgz#fbc06825d8302c95c3334d21023bba996255d45d" + integrity sha1-+8BoJdgwLJXDM00hAju6mWJV1F0= + dependencies: + deep-equal "^1.0.1" + axios@^0.18.0: version "0.18.0" resolved "https://registry.yarnpkg.com/axios/-/axios-0.18.0.tgz#32d53e4851efdc0a11993b6cd000789d70c05102" @@ -1818,6 +2618,13 @@ axios@^0.18.0: follow-redirects "^1.3.0" is-buffer "^1.1.5" +b64@4.x.x: + version "4.1.2" + resolved "https://registry.yarnpkg.com/b64/-/b64-4.1.2.tgz#7015372ba8101f7fb18da070717a93c28c8580d8" + integrity sha512-+GUspBxlH3CJaxMUGUE1EBoWM6RKgWiYwUDal0qdf8m3ArnXNN1KzKVo5HOnE/FSq4HHyWf3TlHLsZI8PKQgrQ== + dependencies: + hoek "6.x.x" + babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" @@ -1940,7 +2747,7 @@ babel-register@^6.26.0: mkdirp "^0.5.1" source-map-support "^0.4.15" -babel-runtime@^6.22.0, babel-runtime@^6.26.0: +babel-runtime@6.26.0, babel-runtime@^6.22.0, babel-runtime@^6.23.0, babel-runtime@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= @@ -1989,11 +2796,23 @@ babylon@^6.18.0: resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== +backo2@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" + integrity sha1-MasayLEpNjRj41s+u2n038+6eUc= + balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= +base-x@^3.0.2: + version "3.0.5" + resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.5.tgz#d3ada59afed05b921ab581ec3112e6444ba0795a" + integrity sha512-C3picSgzPSLE+jW3tcBzJoGwitOtazb5B+5YmAxZm2ybmTi9LNgAtDO/jjVEBZwHoXmDBZ9m/IELj3elJVRBcA== + dependencies: + safe-buffer "^5.0.1" + base64-js@^1.0.2: version "1.3.0" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3" @@ -2019,11 +2838,34 @@ bcrypt-pbkdf@^1.0.0: dependencies: tweetnacl "^0.14.3" +better-sqlite3@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/better-sqlite3/-/better-sqlite3-5.0.1.tgz#5addb5dcf18c9374c570a1eab7694e67fc9437a3" + integrity sha512-dyZk+gDYNPw14maYX5LG/2SCUTiB7jCvETd+bBYqhFyji3oG+UQFN452sUWSjCHCmfg1JtMbLT7WmqB8GLq8Gw== + dependencies: + integer "^2.1.0" + tar "^4.4.6" + +big-time@2.x.x: + version "2.0.1" + resolved "https://registry.yarnpkg.com/big-time/-/big-time-2.0.1.tgz#68c7df8dc30f97e953f25a67a76ac9713c16c9de" + integrity sha1-aMffjcMPl+lT8lpnp2rJcTwWyd4= + big.js@^3.1.3: version "3.2.0" resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" integrity sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q== +bigi@^1.1.0, bigi@^1.2.0: + version "1.4.2" + resolved "https://registry.yarnpkg.com/bigi/-/bigi-1.4.2.tgz#9c665a95f88b8b08fc05cfd731f561859d725825" + integrity sha1-nGZalfiLiwj8Bc/XMfVhhZ1yWCU= + +bignumber.js@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-8.0.1.tgz#5d419191370fb558c64e3e5f70d68e5947138832" + integrity sha512-zAySveTJXkgLYCBi0b14xzfnOs+f3G6x36I8w2a1+PFQpWk/dp0mI0F+ZZK2bu+3ELewDcSyP+Cfq++NcHX7sg== + bin-links@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/bin-links/-/bin-links-1.1.2.tgz#fb74bd54bae6b7befc6c6221f25322ac830d9757" @@ -2035,10 +2877,58 @@ bin-links@^1.1.2: graceful-fs "^4.1.11" write-file-atomic "^2.3.0" -binary-extensions@^1.0.0: - version "1.12.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.12.0.tgz#c2d780f53d45bba8317a8902d4ceeaf3a6385b14" - integrity sha512-DYWGk01lDcxeS/K9IHPGWfT8PsJmbXRtRd2Sx72Tnb8pcYZQFF1oSDb8hJtS1vhp212q1Rzi5dUf9+nq0o9UIg== +binary-extensions@^1.0.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.12.0.tgz#c2d780f53d45bba8317a8902d4ceeaf3a6385b14" + integrity sha512-DYWGk01lDcxeS/K9IHPGWfT8PsJmbXRtRd2Sx72Tnb8pcYZQFF1oSDb8hJtS1vhp212q1Rzi5dUf9+nq0o9UIg== + +bindings@^1.2.1, bindings@^1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.3.1.tgz#21fc7c6d67c18516ec5aaa2815b145ff77b26ea5" + integrity sha512-i47mqjF9UbjxJhxGf+pZ6kSxrnI3wBLlnGI2ArWJ4r0VrvDS7ZYXkprq/pLaBWYq4GM0r4zdHY+NNRqEMU7uew== + +bip32@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bip32/-/bip32-1.0.2.tgz#982e2ad2cae6fc6a2f53dda3e6c3be9364674b28" + integrity sha512-kedLYj8yvYzND+EfzeoMSlGiN7ImiRBF/MClJSZPkMfcU+OQO7ZpL5L/Yg+TunebBZIHhunstiQF//KLKSF5rg== + dependencies: + bs58check "^2.1.1" + create-hash "^1.2.0" + create-hmac "^1.1.7" + tiny-secp256k1 "^1.0.0" + typeforce "^1.11.5" + wif "^2.0.6" + +bip38@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/bip38/-/bip38-2.0.2.tgz#6f7762bc90b0bdf63b489ff95349354aecf9baee" + integrity sha512-22KDak0RDyghFbR0Si7wyq9IgY423YzGYzWLpGeofH3DaolOQqjD3mNN08eFoubKlbyclOQKFwtONMv2SD9V3A== + dependencies: + bigi "^1.2.0" + browserify-aes "^1.0.1" + bs58check "<3.0.0" + buffer-xor "^1.0.2" + create-hash "^1.1.1" + ecurve "^1.0.0" + scryptsy "^2.0.0" + +bip39@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/bip39/-/bip39-2.5.0.tgz#51cbd5179460504a63ea3c000db3f787ca051235" + integrity sha512-xwIx/8JKoT2+IPJpFEfXoWdYwP7UVAoUxxLNfGCfVowaJE7yg1Y5B1BVPqlUNsBq5/nGwmFkwRJ8xDW4sX8OdA== + dependencies: + create-hash "^1.1.0" + pbkdf2 "^3.0.9" + randombytes "^2.0.1" + safe-buffer "^5.0.1" + unorm "^1.3.3" + +bip66@^1.1.3: + version "1.1.5" + resolved "https://registry.yarnpkg.com/bip66/-/bip66-1.1.5.tgz#01fa8748785ca70955d5011217d1b3139969ca22" + integrity sha1-AfqHSHhcpwlV1QESF9GzE5lpyiI= + dependencies: + safe-buffer "^5.0.1" bl@~1.1.2: version "1.1.2" @@ -2054,12 +2944,12 @@ block-stream@*: dependencies: inherits "~2.0.0" -bluebird@^3.4.3, bluebird@^3.5.0, bluebird@^3.5.1, bluebird@^3.5.2, bluebird@^3.5.3: +bluebird@^3.4.3, bluebird@^3.4.6, bluebird@^3.5.0, bluebird@^3.5.1, bluebird@^3.5.2, bluebird@^3.5.3: version "3.5.3" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.3.tgz#7d01c6f9616c9a51ab0f8c549a79dfe6ec33efa7" integrity sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw== -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.11.3, bn.js@^4.11.8, bn.js@^4.4.0: version "4.11.8" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== @@ -2087,6 +2977,28 @@ boom@2.x.x: dependencies: hoek "2.x.x" +boom@7.x.x, boom@^7.1.0, boom@^7.1.1, boom@^7.2.0, boom@^7.3.0: + version "7.3.0" + resolved "https://registry.yarnpkg.com/boom/-/boom-7.3.0.tgz#733a6d956d33b0b1999da3fe6c12996950d017b9" + integrity sha512-Swpoyi2t5+GhOEGw8rEsKvTxFLIDiiKoUc2gsoV6Lyr43LHBIzch3k2MvYUs8RTROrIkVJ3Al0TkaOGjnb+B6A== + dependencies: + hoek "6.x.x" + +boom@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/boom/-/boom-5.2.0.tgz#5dd9da6ee3a5f302077436290cb717d3f4a54e02" + integrity sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw== + dependencies: + hoek "4.x.x" + +bounce@1.x.x: + version "1.2.3" + resolved "https://registry.yarnpkg.com/bounce/-/bounce-1.2.3.tgz#2b286d36eb21d5f08fe672dd8cd37a109baad121" + integrity sha512-3G7B8CyBnip5EahCZJjnvQ1HLyArC6P5e+xcolo13BVI9ogFaDOsNMAE7FIWliHtIkYI8/nTRCvCY9tZa3Mu4g== + dependencies: + boom "7.x.x" + hoek "6.x.x" + boxen@^1.2.1: version "1.3.0" resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b" @@ -2150,7 +3062,7 @@ browser-resolve@^1.11.3: dependencies: resolve "1.1.7" -browserify-aes@^1.0.0, browserify-aes@^1.0.4: +browserify-aes@^1.0.0, browserify-aes@^1.0.1, browserify-aes@^1.0.4, browserify-aes@^1.0.6: version "1.2.0" resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== @@ -2225,6 +3137,22 @@ bs-logger@0.x: dependencies: fast-json-stable-stringify "2.x" +bs58@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" + integrity sha1-vhYedsNU9veIrkBx9j806MTwpCo= + dependencies: + base-x "^3.0.2" + +bs58check@<3.0.0, bs58check@^2.1.1, bs58check@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-2.1.2.tgz#53b018291228d82a5aa08e7d796fdafda54aebfc" + integrity sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA== + dependencies: + bs58 "^4.0.0" + create-hash "^1.1.0" + safe-buffer "^5.1.2" + bser@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/bser/-/bser-2.0.0.tgz#9ac78d3ed5d915804fd87acb158bc797147a1719" @@ -2242,7 +3170,12 @@ buffer-shims@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" integrity sha1-mXjOMXOIxkmth5MCjDR37wRKi1E= -buffer-xor@^1.0.3: +buffer-writer@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/buffer-writer/-/buffer-writer-2.0.0.tgz#ce7eb81a38f7829db09c873f2fbb792c0c98ec04" + integrity sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw== + +buffer-xor@^1.0.2, buffer-xor@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= @@ -2276,6 +3209,14 @@ builtins@^1.0.3: resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" integrity sha1-y5T662HIaWRR2zZTThQi+U8K7og= +busboy@^0.2.14: + version "0.2.14" + resolved "https://registry.yarnpkg.com/busboy/-/busboy-0.2.14.tgz#6c2a622efcf47c57bbbe1e2a9c37ad36c7925453" + integrity sha1-bCpiLvz0fFe7vh4qnDetNseSVFM= + dependencies: + dicer "0.2.5" + readable-stream "1.1.x" + byline@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/byline/-/byline-5.0.0.tgz#741c5216468eadc457b03410118ad77de8c1ddb1" @@ -2286,6 +3227,13 @@ byte-size@^4.0.3: resolved "https://registry.yarnpkg.com/byte-size/-/byte-size-4.0.4.tgz#29d381709f41aae0d89c631f1c81aec88cd40b23" integrity sha512-82RPeneC6nqCdSwCX2hZUz3JPOvN5at/nTEw/CMf05Smu3Hrpo9Psb7LjN+k+XndNArG1EY8L4+BM3aTM4BCvw== +bytebuffer@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/bytebuffer/-/bytebuffer-5.0.1.tgz#582eea4b1a873b6d020a48d58df85f0bba6cfddd" + integrity sha1-WC7qSxqHO20CCkjVjfhfC7ps/d0= + dependencies: + long "~3" + bytes@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" @@ -2326,11 +3274,32 @@ cache-base@^1.0.1: union-value "^1.0.0" unset-value "^1.0.0" +cacheable-request@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-5.2.0.tgz#00c87097835af4caf92a97390660ecadce51187d" + integrity sha512-h1n0vjpFaByTvU6PiyTKk2kx4OnuV1aVUynCUd/FiKl4icpPSceowk3rHczwFEBuZvz+E1EU4KExR0MCPeQfaQ== + dependencies: + clone-response "^1.0.2" + get-stream "^4.0.0" + http-cache-semantics "^4.0.0" + keyv "^3.0.0" + lowercase-keys "^1.0.1" + normalize-url "^3.1.0" + responselike "^1.0.2" + call-me-maybe@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" integrity sha1-JtII6onje1y95gJQoV8DHBak1ms= +call@5.x.x: + version "5.0.3" + resolved "https://registry.yarnpkg.com/call/-/call-5.0.3.tgz#5dc82c698141c2d45c51a9c3c7e0697f43ac46a2" + integrity sha512-eX16KHiAYXugbFu6VifstSdwH6aMuWWb4s0qvpq1nR1b+Sf+u68jjttg8ixDBEldPqBi30bDU35OJQWKeTLKxg== + dependencies: + boom "7.x.x" + hoek "6.x.x" + caller-callsite@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" @@ -2350,6 +3319,14 @@ callsites@^2.0.0: resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= +camel-case@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73" + integrity sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M= + dependencies: + no-case "^2.2.0" + upper-case "^1.1.1" + camelcase-keys@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" @@ -2367,6 +3344,11 @@ camelcase-keys@^4.0.0: map-obj "^2.0.0" quick-lru "^1.0.0" +camelcase@5.0.0, camelcase@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.0.0.tgz#03295527d58bd3cd4aa75363f35b2e8d97be2f42" + integrity sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA== + camelcase@^2.0.0, camelcase@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" @@ -2377,16 +3359,20 @@ camelcase@^4.0.0, camelcase@^4.1.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= -camelcase@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.0.0.tgz#03295527d58bd3cd4aa75363f35b2e8d97be2f42" - integrity sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA== - caniuse-lite@^1.0.30000912: version "1.0.30000918" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000918.tgz#6288f79da3c5c8b45e502f47ad8f3eb91f1379a9" integrity sha512-CAZ9QXGViBvhHnmIHhsTPSWFBujDaelKnUj7wwImbyQRxmXynYqKGi3UaZTSz9MoVh+1EVxOS/DFIkrJYgR3aw== +capture-console@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/capture-console/-/capture-console-1.0.1.tgz#db63c39ac73239019badd7fbb10143eda380ff71" + integrity sha1-22PDmscyOQGbrdf7sQFD7aOA/3E= + dependencies: + argle "~1.1.1" + lodash.isfunction "~3.0.8" + randomstring "~1.1.5" + capture-exit@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-1.2.0.tgz#1c5fcc489fd0ab00d4f1ac7ae1072e3173fbab6f" @@ -2409,6 +3395,33 @@ caseless@~0.12.0: resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= +catbox-memory@3.x.x: + version "3.1.4" + resolved "https://registry.yarnpkg.com/catbox-memory/-/catbox-memory-3.1.4.tgz#114fd6da3b2630a5db2ff246db9ff2226148c2b0" + integrity sha512-1tDnll066au0HXBSDHS/YQ34MQ2omBsmnA9g/jseyq/M3m7UPrajVtPDZK/rXgikSC1dfjo9Pa+kQ1qcyG2d3g== + dependencies: + big-time "2.x.x" + boom "7.x.x" + hoek "6.x.x" + +catbox@10.x.x: + version "10.0.5" + resolved "https://registry.yarnpkg.com/catbox/-/catbox-10.0.5.tgz#53915f0558d14e679bf10c90f6a9f79af99147b7" + integrity sha512-5SpI/tEP3SiLE1qkkV+/hdVW48sHVBEbzPX4jBiwl6hsZh/gkl4bqfGLkvh7mjpMK5evJ0Rm/6NRlhF/Jsy9ow== + dependencies: + boom "7.x.x" + hoek "6.x.x" + joi "14.x.x" + +chalk@2.4.1, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.3.0, chalk@^2.3.1, chalk@^2.3.2, chalk@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" + integrity sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" @@ -2420,15 +3433,6 @@ chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.0.0, chalk@^2.0.1, chalk@^2.3.0, chalk@^2.3.1, chalk@^2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" - integrity sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - chardet@^0.4.0: version "0.4.2" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" @@ -2504,6 +3508,11 @@ class-utils@^0.3.5: isobject "^3.0.0" static-extend "^0.1.1" +clean-stack@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-1.3.0.tgz#9e821501ae979986c46b1d66d2d432db2fd4ae31" + integrity sha1-noIVAa6XmYbEax1m0tQy2y/UrjE= + cli-boxes@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" @@ -2516,6 +3525,24 @@ cli-cursor@^2.0.0, cli-cursor@^2.1.0: dependencies: restore-cursor "^2.0.0" +cli-progress@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/cli-progress/-/cli-progress-2.1.1.tgz#45ee1b143487c19043a3262131ccb4676f87f032" + integrity sha512-TSJw3LY9ZRSis7yYzQ7flIdtQMbacd9oYoiFphJhI4SzgmqF0zErO+uNv0lbUjk1L4AGfHQJ4OVYYzW+JV66KA== + dependencies: + colors "^1.1.2" + string-width "^2.1.1" + +cli-table3@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.5.1.tgz#0252372d94dfc40dbd8df06005f48f31f656f202" + integrity sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw== + dependencies: + object-assign "^4.1.0" + string-width "^2.1.1" + optionalDependencies: + colors "^1.1.2" + cli-table@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/cli-table/-/cli-table-0.3.1.tgz#f53b05266a8b1a0b934b3d0821e6e2dc5914ae23" @@ -2536,6 +3563,14 @@ cli-width@^2.0.0: resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= +clipboardy@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/clipboardy/-/clipboardy-1.2.3.tgz#0526361bf78724c1f20be248d428e365433c07ef" + integrity sha512-2WNImOvCRe6r63Gk9pShfkwXsVtKCroMAevIbiae021mS850UkWPbevxsBz3tnvjZIEGvlwaqCPsw+4ulzNgJA== + dependencies: + arch "^2.1.0" + execa "^0.8.0" + cliui@^3.0.3: version "3.2.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" @@ -2564,11 +3599,26 @@ clone-deep@^0.3.0: kind-of "^3.2.2" shallow-clone "^0.1.2" +clone-response@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" + integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= + dependencies: + mimic-response "^1.0.0" + clone@^1.0.2: version "1.0.4" resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= +cls-bluebird@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cls-bluebird/-/cls-bluebird-2.1.0.tgz#37ef1e080a8ffb55c2f4164f536f1919e7968aee" + integrity sha1-N+8eCAqP+1XC9BZPU28ZGeeWiu4= + dependencies: + is-bluebird "^1.0.2" + shimmer "^1.1.0" + cmd-shim@^2.0.2, cmd-shim@~2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/cmd-shim/-/cmd-shim-2.0.2.tgz#6fcbda99483a8fd15d7d30a196ca69d688a2efdb" @@ -2606,7 +3656,7 @@ collection-visit@^1.0.0: map-visit "^1.0.0" object-visit "^1.0.0" -color-convert@^1.9.0: +color-convert@^1.9.0, color-convert@^1.9.1: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== @@ -2618,11 +3668,50 @@ color-name@1.1.3: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= +color-name@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +color-string@^1.5.2: + version "1.5.3" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.3.tgz#c9bbc5f01b58b5492f3d6857459cb6590ce204cc" + integrity sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color@3.0.x: + version "3.0.0" + resolved "https://registry.yarnpkg.com/color/-/color-3.0.0.tgz#d920b4328d534a3ac8295d68f7bd4ba6c427be9a" + integrity sha512-jCpd5+s0s0t7p3pHQKpnJ0TpQKKdleP71LWcA0aqiljpiuAkOSUFN/dyH8ZwF0hRmFlrIuRhufds1QyEP9EB+w== + dependencies: + color-convert "^1.9.1" + color-string "^1.5.2" + +colornames@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/colornames/-/colornames-1.1.1.tgz#f8889030685c7c4ff9e2a559f5077eb76a816f96" + integrity sha1-+IiQMGhcfE/54qVZ9Qd+t2qBb5Y= + colors@1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" integrity sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs= +colors@^1.1.2, colors@^1.2.1, colors@^1.3.2: + version "1.3.3" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.3.3.tgz#39e005d546afe01e01f9c4ca8fa50f686a01205d" + integrity sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg== + +colorspace@1.1.x: + version "1.1.1" + resolved "https://registry.yarnpkg.com/colorspace/-/colorspace-1.1.1.tgz#9ac2491e1bc6f8fb690e2176814f8d091636d972" + integrity sha512-pI3btWyiuz7Ken0BWh9Elzsmv2bM9AhA7psXib4anUXy/orfZ/E0MbQwhSOG/9L8hLlalqrU0UhOuqxW1YjmVw== + dependencies: + color "3.0.x" + text-hex "1.0.x" + columnify@^1.5.4, columnify@~1.5.4: version "1.5.4" resolved "https://registry.yarnpkg.com/columnify/-/columnify-1.5.4.tgz#4737ddf1c7b69a8a7c340570782e947eec8e78bb" @@ -2638,7 +3727,7 @@ combined-stream@^1.0.5, combined-stream@^1.0.6, combined-stream@~1.0.5, combined dependencies: delayed-stream "~1.0.0" -commander@^2.12.1, commander@^2.14.1, commander@^2.9.0: +commander@2.19.0, commander@^2.12.1, commander@^2.14.1, commander@^2.19.0, commander@^2.9.0: version "2.19.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg== @@ -2728,6 +3817,13 @@ content-type@~1.0.4: resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== +content@4.x.x: + version "4.0.6" + resolved "https://registry.yarnpkg.com/content/-/content-4.0.6.tgz#76ffd96c5cbccf64fe3923cbb9c48b8bc04b273e" + integrity sha512-lR9ND3dXiMdmsE84K6l02rMdgiBVmtYWu1Vr/gfSGHcIcznBj2QxmSdUgDuNFOA+G9yrb1IIWkZ7aKtB6hDGyA== + dependencies: + boom "7.x.x" + conventional-changelog-angular@^5.0.2: version "5.0.2" resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-5.0.2.tgz#39d945635e03b6d0c9d4078b1df74e06163dc66a" @@ -2850,6 +3946,11 @@ core-js@^2.4.0, core-js@^2.5.0: resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.0.tgz#1e30793e9ee5782b307e37ffa22da0eacddd84d4" integrity sha512-kLRC6ncVpuEW/1kwrOXYX6KQASCVtrh1gQr/UiaVgFlf9WE5Vp+lNe5+h3LuMr5PAucWnnEXwH0nQHRH/gpGtw== +core-js@^3.0.0-beta.3: + version "3.0.0-beta.5" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.0.0-beta.5.tgz#0d09e0cbb45eedef427e72cc1d7725602805f909" + integrity sha512-lv/UPXe8QIvAX4XEgz3u9gpSbYr0Et6gaVhwMEH6SN9Uk+aIhk9IMwQUa35pymUiA4t2THPOaqysDJtX4jcm3w== + core-js@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.3.0.tgz#fab83fbb0b2d8dc85fa636c4b9d34c75420c6d65" @@ -2879,6 +3980,35 @@ cosmiconfig@^5.0.2, cosmiconfig@^5.0.7: js-yaml "^3.9.0" parse-json "^4.0.0" +cp-file@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cp-file/-/cp-file-6.0.0.tgz#f38477ece100b403fcf780fd34d030486beb693e" + integrity sha512-OtHMgPugkgwHlbph25wlMKd358lZNhX1Y2viUpPoFmlBPlEiPIRhztYWha11grbGPnlM+urp5saVmwsChCIOEg== + dependencies: + graceful-fs "^4.1.2" + make-dir "^1.0.0" + nested-error-stacks "^2.0.0" + pify "^3.0.0" + safe-buffer "^5.0.1" + +cpy-cli@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/cpy-cli/-/cpy-cli-2.0.0.tgz#13f1528a231605c52ee7b7f74848e4be82253274" + integrity sha512-LzrtY3lBWvFZcw4lXgkEbbDUd7y78juC3C5l7gj3UyezMEZF0Be9fjCVLN1HoZAzdMDeC3KHehWpHBJvgVAPkw== + dependencies: + cpy "^7.0.0" + meow "^5.0.0" + +cpy@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/cpy/-/cpy-7.0.1.tgz#d817e4d81bd7f0f25ff812796c5f1392dc0fb485" + integrity sha512-Zo52tXKLJcgy/baacn6KaNoRAakkl2wb+R4u6qJ4wlD0uchncwRQcIk66PlGlkzuToCJO6A6PWX27Tdwc8LU2g== + dependencies: + arrify "^1.0.1" + cp-file "^6.0.0" + globby "^8.0.1" + nested-error-stacks "^2.0.0" + create-ecdh@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" @@ -2894,7 +4024,7 @@ create-error-class@^3.0.0: dependencies: capture-stack-trace "^1.0.0" -create-hash@^1.1.0, create-hash@^1.1.2: +create-hash@^1.1.0, create-hash@^1.1.1, create-hash@^1.1.2, create-hash@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== @@ -2905,7 +4035,7 @@ create-hash@^1.1.0, create-hash@^1.1.2: ripemd160 "^2.0.1" sha.js "^2.4.0" -create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: +create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4, create-hmac@^1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== @@ -2952,6 +4082,13 @@ cryptiles@2.x.x: dependencies: boom "2.x.x" +cryptiles@4.x.x: + version "4.1.3" + resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-4.1.3.tgz#2461d3390ea0b82c643a6ba79f0ed491b0934c25" + integrity sha512-gT9nyTMSUC1JnziQpPbxKGBbUg8VL7Zn2NB4E1cJYvuXdElHrwxrV9bmltZGDzet45zSDGyYceueke1TjynGzw== + dependencies: + boom "7.x.x" + crypto-browserify@^3.11.0: version "3.12.0" resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" @@ -2993,6 +4130,11 @@ currently-unhandled@^0.4.1: dependencies: array-find-index "^1.0.1" +cycle@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/cycle/-/cycle-1.0.3.tgz#21e80b2be8580f98b468f379430662b046c34ad2" + integrity sha1-IegLK+hYD5i0aPN5QwZisEbDStI= + cyclist@~0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640" @@ -3043,11 +4185,19 @@ date-now@^0.1.4: resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" integrity sha1-6vQ5/U1ISK105cx9vvIAZyueNFs= -dateformat@^3.0.0: +dateformat@^3.0.0, dateformat@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q== +dayjs-ext@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/dayjs-ext/-/dayjs-ext-2.2.0.tgz#2d1ed1e2a8dccc260122d4685e8422062edc5dbb" + integrity sha512-n7u711rSmAOPcx1xqj2WUSU/1PbWEst1VC/FeIQsC/ULQLNVlAUwYwRc8D1CdTWqZgliw/SVcox+xNyQl9Q4IA== + dependencies: + fast-plural-rules "^0.0.1" + timezone-support "^1.8.0" + debug@2, debug@2.6.9, debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -3099,11 +4249,23 @@ decode-uri-component@^0.2.0: resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= +decompress-response@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" + integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= + dependencies: + mimic-response "^1.0.0" + dedent@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= +deep-equal@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" + integrity sha1-9dJgKStmDghO/0zbyfCK0yR0SLU= + deep-extend@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" @@ -3114,6 +4276,11 @@ deep-is@~0.1.3: resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= +deepmerge@*, deepmerge@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-3.0.0.tgz#ca7903b34bfa1f8c2eab6779280775a411bfc6ba" + integrity sha512-a8z8bkgHsAML+uHLqmMS83HHlpy3PvZOOuiTQqaa3wu8ZVg3h0hqHk6aCsGdOnZV2XMM/FRimNGjUh0KCcmHBw== + default-require-extensions@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-1.0.0.tgz#f37ea15d3e13ffd9b437d33e1a75b5fb97874cb8" @@ -3128,6 +4295,11 @@ defaults@^1.0.3: dependencies: clone "^1.0.2" +defer-to-connect@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.0.1.tgz#41ec1dd670dc4c6dcbe7e54c9e44d784d025fe63" + integrity sha512-2e0FJesseUqQj671gvZWfUyxpnFx/5n4xleamlpCD3U6Fm5dh5qzmmLNxNhtmHF06+SYVHH8QU6FACffYTnj0Q== + define-properties@^1.1.2: version "1.1.3" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" @@ -3187,6 +4359,11 @@ del@^3.0.0: pify "^3.0.0" rimraf "^2.2.8" +delay@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/delay/-/delay-4.1.0.tgz#474cd28809da41d1a048a70a1d835f47ac377cd2" + integrity sha512-8Hea6/aOu3bPdDBQhSRUEUzF0QwuWmSPuIK+sxNdvcJtSfzb6HXrTd9DFJBCJcV9o83fFECqTgllqdnmUfq9+w== + delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" @@ -3197,11 +4374,16 @@ delegates@^1.0.0: resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= -depd@~1.1.2: +depd@^1.1.0, depd@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= +deprecated-decorator@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/deprecated-decorator/-/deprecated-decorator-0.1.6.tgz#00966317b7a12fe92f3cc831f7583af329b86c37" + integrity sha1-AJZjF7ehL+kvPMgx91g68ym4bDc= + des.js@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" @@ -3245,6 +4427,23 @@ dezalgo@^1.0.0, dezalgo@^1.0.1, dezalgo@~1.0.3: asap "^2.0.0" wrappy "1" +diagnostics@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/diagnostics/-/diagnostics-1.1.1.tgz#cab6ac33df70c9d9a727490ae43ac995a769b22a" + integrity sha512-8wn1PmdunLJ9Tqbx+Fx/ZEuHfJf4NKSN2ZBj7SJC/OWRWha843+WsTjqMe1B5E3p28jqBlp+mJ2fPVxPyNgYKQ== + dependencies: + colorspace "1.1.x" + enabled "1.0.x" + kuler "1.0.x" + +dicer@0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/dicer/-/dicer-0.2.5.tgz#5996c086bb33218c812c090bddc09cd12facb70f" + integrity sha1-WZbAhrszIYyBLAkL3cCc0S+stw8= + dependencies: + readable-stream "1.1.x" + streamsearch "0.1.2" + diff@^3.2.0: version "3.5.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" @@ -3305,6 +4504,25 @@ dot-prop@^4.1.0, dot-prop@^4.2.0: dependencies: is-obj "^1.0.0" +dottie@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/dottie/-/dottie-2.0.1.tgz#697ad9d72004db7574d21f892466a3c285893659" + integrity sha512-ch5OQgvGDK2u8pSZeSYAQaV/lczImd7pMJ7BcEPXmnFVjy4yJIzP6CsODJUTH8mg1tyH1Z2abOiuJO3DjZ/GBw== + +drbg.js@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/drbg.js/-/drbg.js-1.0.1.tgz#3e36b6c42b37043823cdbc332d58f31e2445480b" + integrity sha1-Pja2xCs3BDgjzbwzLVjzHiRFSAs= + dependencies: + browserify-aes "^1.0.6" + create-hash "^1.1.2" + create-hmac "^1.1.4" + +ducky@2.6.11: + version "2.6.11" + resolved "https://registry.yarnpkg.com/ducky/-/ducky-2.6.11.tgz#b1ed769398a4b563d3dd55c0b28ab8b93bcfe3de" + integrity sha512-ubD7rFjOg29Y7UBVZNUzM0S5LuKfqA/wkszwgH/TuXH/Vgr3OFoVBpRb8qoCW3mwexS9bCMD1PEXJDzShzw5EQ== + duplexer3@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" @@ -3315,7 +4533,7 @@ duplexer@^0.1.1: resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" integrity sha1-rOb/gIwc5mtX0ev5eXessCM0z8E= -duplexify@^3.4.2, duplexify@^3.6.0: +duplexify@^3.4.2, duplexify@^3.5.3, duplexify@^3.6.0: version "3.6.1" resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.6.1.tgz#b1a7a29c4abfd639585efaecce80d666b1e34125" integrity sha512-vM58DwdnKmty+FSPzT14K9JXb90H+j5emaR4KYbr2KTIz00WHGbWOe5ghQTx233ZCLZtrGDALzKwcjEtSt35mA== @@ -3325,6 +4543,14 @@ duplexify@^3.4.2, duplexify@^3.6.0: readable-stream "^2.0.0" stream-shift "^1.0.0" +eachr@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/eachr/-/eachr-3.2.0.tgz#2c35e43ea086516f7997cf80b7aa64d55a4a4484" + integrity sha1-LDXkPqCGUW95l8+At6pk1VpKRIQ= + dependencies: + editions "^1.1.1" + typechecker "^4.3.0" + ecc-jsbn@~0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" @@ -3333,6 +4559,27 @@ ecc-jsbn@~0.1.1: jsbn "~0.1.0" safer-buffer "^2.1.0" +ecurve@^1.0.0: + version "1.0.6" + resolved "https://registry.yarnpkg.com/ecurve/-/ecurve-1.0.6.tgz#dfdabbb7149f8d8b78816be5a7d5b83fcf6de797" + integrity sha512-/BzEjNfiSuB7jIWKcS/z8FK9jNjmEWvUV2YZ4RLSmcDtP7Lq0m6FvDuSnJpBlDpGRpfRQeTLGLBI8H+kEv0r+w== + dependencies: + bigi "^1.1.0" + safe-buffer "^5.0.1" + +editions@^1.1.1, editions@^1.3.3, editions@^1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/editions/-/editions-1.3.4.tgz#3662cb592347c3168eb8e498a0ff73271d67f50b" + integrity sha512-gzao+mxnYDzIysXKMQi/+M1mjy/rjestjg6OPoYTtI+3Izp23oiGZitsl9lPDPiTGXbcSIk1iJWhliSaglxnUg== + +editions@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/editions/-/editions-2.1.0.tgz#5c6f6341ef19ee362a3bcbb907fe68e696dbc69e" + integrity sha512-yKrimWcvOXcYXtqsOeebbMLynm9qbYVd0005wveGU2biPxJaJoxA0jtaZrxiMe3mAanLr5lxoYFVz5zjv9JdnA== + dependencies: + errlop "^1.0.3" + semver "^5.6.0" + editor@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/editor/-/editor-1.0.0.tgz#60c7f87bd62bcc6a894fa8ccd6afb7823a24f742" @@ -3343,6 +4590,15 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= +elasticsearch@^15.2.0: + version "15.2.0" + resolved "https://registry.yarnpkg.com/elasticsearch/-/elasticsearch-15.2.0.tgz#234362b5aa743d9c0a925566569ea7813b8f2569" + integrity sha512-jOFcBoEh3Sn3gjUTozInODZTLriJtfppAUC7jnQCUE+OUj8o7GoAyC+L4h/L3ZxmXNFbQCunqVR+nmSofHdo9A== + dependencies: + agentkeepalive "^3.4.1" + chalk "^1.0.0" + lodash "^4.17.10" + electron-to-chromium@^1.3.86: version "1.3.90" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.90.tgz#b4c51b8303beff18f2b74817402bf4898e09558a" @@ -3353,7 +4609,7 @@ elegant-spinner@^1.0.1: resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e" integrity sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4= -elliptic@^6.0.0: +elliptic@^6.0.0, elliptic@^6.2.3, elliptic@^6.4.0: version "6.4.1" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.1.tgz#c2d0b7776911b86722c632c3c06c60f2f819939a" integrity sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ== @@ -3376,6 +4632,13 @@ emojis-list@^2.0.0: resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= +enabled@1.0.x: + version "1.0.2" + resolved "https://registry.yarnpkg.com/enabled/-/enabled-1.0.2.tgz#965f6513d2c2d1c5f4652b64a2e3396467fc2f93" + integrity sha1-ll9lE9LC0cX0ZStkouM5ZGf8L5M= + dependencies: + env-variable "0.0.x" + encodeurl@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" @@ -3395,7 +4658,7 @@ end-of-stream@^1.0.0, end-of-stream@^1.1.0: dependencies: once "^1.4.0" -enhanced-resolve@^4.1.0: +enhanced-resolve@^4.0.0, enhanced-resolve@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz#41c7e0bfdfe74ac1ffe1e57ad6a5c6c9f3742a7f" integrity sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng== @@ -3404,11 +4667,33 @@ enhanced-resolve@^4.1.0: memory-fs "^0.4.0" tapable "^1.0.0" +env-variable@0.0.x: + version "0.0.5" + resolved "https://registry.yarnpkg.com/env-variable/-/env-variable-0.0.5.tgz#913dd830bef11e96a039c038d4130604eba37f88" + integrity sha512-zoB603vQReOFvTg5xMl9I1P2PnHsHQQKTEowsKKD7nseUfJq6UWzK+4YtlWUO1nhiQUxe6XMkk+JleSZD1NZFA== + +envfile@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/envfile/-/envfile-2.3.0.tgz#0ced8f8846e45e2868623c54ecfe3d1914b1e3f4" + integrity sha512-xcwno0xGhSVhgBfFx9SxwYd6FNfTdq8SMFjrQ4FYsxYUNQMPJTXn7dERrX439F1V4Ukk9x/nL/5GcNZaIVUT7g== + dependencies: + ambi "^2.4.0" + eachr "^3.1.0" + editions "^1.3.3" + typechecker "^4.0.1" + err-code@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/err-code/-/err-code-1.1.2.tgz#06e0116d3028f6aef4806849eb0ea6a748ae6960" integrity sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA= +errlop@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/errlop/-/errlop-1.0.3.tgz#dba29c90cf832c3d2ce469fe515d7e5eef2c6676" + integrity sha512-5VTnt0yikY4LlQEfCXVSqfE6oLj1HVM4zVSvAKMnoYjL/zrb6nqiLowZS4XlG7xENfyj7lpYWvT+wfSCr6dtlA== + dependencies: + editions "^1.3.4" + errno@^0.1.3, errno@~0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" @@ -3423,6 +4708,13 @@ error-ex@^1.2.0, error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" +error-stack-parser@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/error-stack-parser/-/error-stack-parser-2.0.2.tgz#4ae8dbaa2bf90a8b450707b9149dcabca135520d" + integrity sha512-E1fPutRDdIj/hohG0UpT5mayXNCxXP9d+snxFsPU9X0XgccOumKraa3juDMwTUyi7+Bu5+mCGagjg4IYeNbOdw== + dependencies: + stackframe "^1.0.4" + es-abstract@^1.5.1: version "1.12.0" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.12.0.tgz#9dbbdd27c6856f0001421ca18782d786bf8a6165" @@ -3548,6 +4840,16 @@ etag@~1.8.1: resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= +event-lite@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/event-lite/-/event-lite-0.1.2.tgz#838a3e0fdddef8cc90f128006c8e55a4e4e4c11b" + integrity sha512-HnSYx1BsJ87/p6swwzv+2v6B4X+uxUteoDfRxsAb1S1BePzQqOLevVmkdA15GHJVd9A9Ok6wygUR18Hu0YeV9g== + +eventemitter3@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.0.tgz#090b4d6cdbd645ed10bf750d4b5407942d7ba163" + integrity sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA== + events@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" @@ -3594,6 +4896,19 @@ execa@^0.7.0: signal-exit "^3.0.0" strip-eof "^1.0.0" +execa@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.8.0.tgz#d8d76bbc1b55217ed190fd6dd49d3c774ecfc8da" + integrity sha1-2NdrvBtVIX7RkP1t1J08d07PyNo= + dependencies: + cross-spawn "^5.0.1" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + execa@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" @@ -3632,6 +4947,11 @@ expand-brackets@^2.1.4: snapdragon "^0.8.1" to-regex "^3.0.1" +expand-home-dir@0.0.3, expand-home-dir@^0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/expand-home-dir/-/expand-home-dir-0.0.3.tgz#72de8a0486cc28a3bbd704635398825b5b62827d" + integrity sha1-ct6KBIbMKKO71wRjU5iCW1tign0= + expand-range@^1.8.1: version "1.8.2" resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" @@ -3778,6 +5098,11 @@ fast-glob@^2.0.2: merge2 "^1.2.3" micromatch "^3.1.10" +fast-json-parse@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/fast-json-parse/-/fast-json-parse-1.0.3.tgz#43e5c61ee4efa9265633046b770fb682a7577c4d" + integrity sha512-FRWsaZRWEJ1ESVNbDWmsAlqDk96gPQezzLghafp5J4GUKjbCz3OkAHuZs5TuPEtkbVQERysLp9xv6c24fBm8Aw== + fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" @@ -3788,6 +5113,21 @@ fast-levenshtein@~2.0.4: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= +fast-plural-rules@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/fast-plural-rules/-/fast-plural-rules-0.0.1.tgz#7032c8afa979e6dc65a452f0ef5b4ef31eca763b" + integrity sha512-0Cxx7LaH7+dNJEBozlisCxqaN5g68VTFT9PyLeFGBHmkPnQ3e46zss+r8pRC94KpzPlitL6m33GVdbMIDiUgqg== + +fast-redact@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/fast-redact/-/fast-redact-1.4.2.tgz#14989f452ee07f0723fbb483ee778d363135b7ad" + integrity sha512-ttC8IgelNvYqb9RBC+rirgUCVPtPVonfdeRdsHBcBx3kzQat1DafbUKAEhLo5GnvuBqda+Xe1BvblecPpQkZ2Q== + +fast-safe-stringify@2.0.x, fast-safe-stringify@^2.0.4, fast-safe-stringify@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.0.6.tgz#04b26106cc56681f51a044cfc0d76cf0008ac2c2" + integrity sha512-q8BZ89jjc+mz08rSxROs8VsrBBcn1SIw1kq9NjolL509tkABRk9io01RAjSaEv1Xb2uFLt8VtRiZbGp5H8iDtg== + fb-watchman@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.0.tgz#54e9abf7dfa2f26cd9b1636c588c1afc05de5d58" @@ -3795,6 +5135,11 @@ fb-watchman@^2.0.0: dependencies: bser "^2.0.0" +fecha@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fecha/-/fecha-2.3.3.tgz#948e74157df1a32fd1b12c3a3c3cdcb6ec9d96cd" + integrity sha512-lUGBnIamTAwk4znq5BcqsDaxSmZ9nDVJaij6NvRt/Tg4R69gERA+otPKbS86ROw9nxVMw2/mp1fnaiWqbs6Sdg== + figgy-pudding@^3.1.0, figgy-pudding@^3.4.1, figgy-pudding@^3.5.1: version "3.5.1" resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" @@ -3815,6 +5160,13 @@ figures@^2.0.0: dependencies: escape-string-regexp "^1.0.5" +file-stream-rotator@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/file-stream-rotator/-/file-stream-rotator-0.4.1.tgz#09f67b86d6ea589d20b7852c51c59de55d916d6d" + integrity sha512-W3aa3QJEc8BS2MmdVpQiYLKHj3ijpto1gMDlsgCRSKfIUe6MwkcpODGPQ3vZfb0XvCeCqlu9CBQTN7oQri2TZQ== + dependencies: + moment "^2.11.2" + file-uri-to-path@1: version "1.0.0" resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" @@ -3917,6 +5269,11 @@ find-up@^3.0.0: dependencies: locate-path "^3.0.0" +flatstr@^1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/flatstr/-/flatstr-1.0.9.tgz#0950d56fec02de1030c1311847ecd58c25690eb9" + integrity sha512-qFlJnOBWDfIaunF54/lBqNKmXOI0HqNhu+mHkLmbaBXlS71PUd9OjFOdyevHt/aHoHB1+eW7eKHgRKOG5aHSpw== + flush-write-stream@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.0.3.tgz#c5d586ef38af6097650b49bc41b55fabb19f35bd" @@ -4004,7 +5361,12 @@ from2@^2.1.0: inherits "^2.0.1" readable-stream "^2.0.0" -fs-extra@^7.0.0: +fs-capacitor@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/fs-capacitor/-/fs-capacitor-1.0.1.tgz#ff9dbfa14dfaf4472537720f19c3088ed9278df0" + integrity sha512-XdZK0Q78WP29Vm3FGgJRhRhrBm51PagovzWtW2kJ3Q6cYJbGtZqWSGTSPwvtEkyjIirFd7b8Yes/dpOYjt4RRQ== + +fs-extra@^7.0.0, fs-extra@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== @@ -4144,6 +5506,11 @@ generate-object-property@^1.1.0: dependencies: is-property "^1.0.0" +generic-pool@^3.4.0: + version "3.4.2" + resolved "https://registry.yarnpkg.com/generic-pool/-/generic-pool-3.4.2.tgz#92ff7196520d670839a67308092a12aadf2f6a59" + integrity sha512-H7cUpwCQSiJmAHM4c/aFu6fUfrhWXW1ncyh8ftxEPMu6AiYkHw9K8br720TGPZJbk5eOH2bynjZD1yPvdDAmag== + genfun@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/genfun/-/genfun-5.0.0.tgz#9dd9710a06900a5c4a5bf57aca5da4e52fe76537" @@ -4336,6 +5703,11 @@ globals@^9.18.0: resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== +globalyzer@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/globalyzer/-/globalyzer-0.1.0.tgz#cb76da79555669a1519d5a8edf093afaa0bf1465" + integrity sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q== + globby@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" @@ -4360,6 +5732,39 @@ globby@^8.0.1: pify "^3.0.0" slash "^1.0.0" +globrex@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/globrex/-/globrex-0.1.1.tgz#cfe565cfa910707d0ef98eb0b9d78c3c055ca2ef" + integrity sha512-bqKcPhb+ZtrISivpu6oLmwIyINlPlzueO/BDCdfnzUeu7SYxnHTXmWP7uQI5PnQXc5yGXOscGBEGagloA2hcSw== + +good-console@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/good-console/-/good-console-7.1.0.tgz#ebcf948d7adb8898145bdc76f2f7cdd64641b4a0" + integrity sha1-68+UjXrbiJgUW9x28vfN1kZBtKA= + dependencies: + hoek "4.x.x" + joi "12.x.x" + json-stringify-safe "5.0.x" + moment "2.20.x" + +good-squeeze@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/good-squeeze/-/good-squeeze-5.1.0.tgz#265f3e8be6081aa44c55d484d1af375e166752b9" + integrity sha1-Jl8+i+YIGqRMVdSE0a83XhZnUrk= + dependencies: + fast-safe-stringify "2.0.x" + hoek "4.2.x" + +good@^8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/good/-/good-8.1.1.tgz#02b38a9bdab4862d9a4e7897b13a88f6663cd81f" + integrity sha512-iq6cmWjULCgiCSlSdt263G8vdQxaymi7R6kmS/lEf5nNsKv3StPGtZcTzHn2qzkk0b4hZt/y9sFFZrmF2sSm7w== + dependencies: + hoek "5.x.x" + joi "13.x.x" + oppsy "2.x.x" + pumpify "1.3.x" + got@^6.7.1: version "6.7.1" resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" @@ -4377,24 +5782,105 @@ got@^6.7.1: unzip-response "^2.0.1" url-parse-lax "^1.0.0" -graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@~4.1.9: - version "4.1.15" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" - integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== +got@^9.3.2: + version "9.4.0" + resolved "https://registry.yarnpkg.com/got/-/got-9.4.0.tgz#3b52a54306514b0404b869e1ba572b594772f2b1" + integrity sha512-k15lhRXITxW0eURHfEGzV+8pBYBHtTrYterFlMzP5rXQcQMPikDC2wvZkgivcJwGH4bv1JzMUTPlHfYGhuXJnw== + dependencies: + "@sindresorhus/is" "^0.12.0" + "@szmarczak/http-timer" "^1.1.0" + cacheable-request "^5.1.0" + decompress-response "^3.3.0" + duplexer3 "^0.1.4" + get-stream "^4.1.0" + lowercase-keys "^1.0.1" + mimic-response "^1.0.1" + p-cancelable "^1.0.0" + to-readable-stream "^1.0.0" + url-parse-lax "^3.0.0" + +graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@~4.1.9: + version "4.1.15" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" + integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== + +graphlib@^2.1.1, graphlib@^2.1.5: + version "2.1.7" + resolved "https://registry.yarnpkg.com/graphlib/-/graphlib-2.1.7.tgz#b6a69f9f44bd9de3963ce6804a2fc9e73d86aecc" + integrity sha512-TyI9jIy2J4j0qgPmOOrHTCtpPqJGN/aurBwc6ZT+bRii+di1I+Wv3obRhVrmBEXet+qkMaEX67dXrwsd3QQM6w== + dependencies: + lodash "^4.17.5" + +graphql-extensions@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/graphql-extensions/-/graphql-extensions-0.4.0.tgz#5857c7b7b9f20dbccbfd88730fffa5963b3c61ee" + integrity sha512-8TUgIIUVpXWOcqq9RdmTSHUrhc3a/s+saKv9cCl8TYWHK9vyJIdea7ZaSKHGDthZNcsN+C3LulZYRL3Ah8ukoA== + dependencies: + "@apollographql/apollo-tools" "^0.2.6" + +graphql-extensions@0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/graphql-extensions/-/graphql-extensions-0.4.1.tgz#92c49a8409ffbfb24559d7661ab60cc90d6086e4" + integrity sha512-Xei4rBxbsTHU6dYiq9y1xxbpRMU3+Os7yD3vXV5W4HbTaxRMizDmu6LAvV4oBEi0ttwICHARQjYTjDTDhHnxrQ== + dependencies: + "@apollographql/apollo-tools" "^0.2.6" + +graphql-subscriptions@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/graphql-subscriptions/-/graphql-subscriptions-1.0.0.tgz#475267694b3bd465af6477dbab4263a3f62702b8" + integrity sha512-+ytmryoHF1LVf58NKEaNPRUzYyXplm120ntxfPcgOBC7TnK7Tv/4VRHeh4FAR9iL+O1bqhZs4nkibxQ+OA5cDQ== + dependencies: + iterall "^1.2.1" + +graphql-tag@^2.9.2: + version "2.10.0" + resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.10.0.tgz#87da024be863e357551b2b8700e496ee2d4353ae" + integrity sha512-9FD6cw976TLLf9WYIUPCaaTpniawIjHWZSwIRZSjrfufJamcXbVVYfN2TWvJYbw0Xf2JjYbl1/f2+wDnBVw3/w== -graphlib@^2.1.1, graphlib@^2.1.5: - version "2.1.7" - resolved "https://registry.yarnpkg.com/graphlib/-/graphlib-2.1.7.tgz#b6a69f9f44bd9de3963ce6804a2fc9e73d86aecc" - integrity sha512-TyI9jIy2J4j0qgPmOOrHTCtpPqJGN/aurBwc6ZT+bRii+di1I+Wv3obRhVrmBEXet+qkMaEX67dXrwsd3QQM6w== +graphql-tools-types@^1.1.26: + version "1.1.26" + resolved "https://registry.yarnpkg.com/graphql-tools-types/-/graphql-tools-types-1.1.26.tgz#860d50c101eb1e0f096f0350fc1ce9d0517849fe" + integrity sha512-syqYHBoA/WiUgGBPCI/9Dwlo4EO6ezP5WbOHFjZqT5H8LpO4The18PtxdaP1bm94LkZhcEiW6XiBd+F/E9ym6A== dependencies: - lodash "^4.17.5" + babel-runtime "6.26.0" + ducky "2.6.11" + graphql "0.13.2" + pure-uuid "1.5.3" + +graphql-tools@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/graphql-tools/-/graphql-tools-4.0.3.tgz#23b5cb52c519212b1b2e4630a361464396ad264b" + integrity sha512-NNZM0WSnVLX1zIMUxu7SjzLZ4prCp15N5L2T2ro02OVyydZ0fuCnZYRnx/yK9xjGWbZA0Q58yEO//Bv/psJWrg== + dependencies: + apollo-link "^1.2.3" + apollo-utilities "^1.0.1" + deprecated-decorator "^0.1.6" + iterall "^1.1.3" + uuid "^3.1.0" + +graphql-upload@^8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/graphql-upload/-/graphql-upload-8.0.2.tgz#1c1f116f15b7f8485cf40ff593a21368f0f58856" + integrity sha512-u8a5tKPfJ0rU4MY+B3skabL8pEjMkm3tUzq25KBx6nT0yEWmqUO7Z5tdwvwYLFpkLwew94Gue0ARbZtar3gLTw== + dependencies: + busboy "^0.2.14" + fs-capacitor "^1.0.0" + http-errors "^1.7.1" + object-path "^0.11.4" + +graphql@0.13.2: + version "0.13.2" + resolved "https://registry.yarnpkg.com/graphql/-/graphql-0.13.2.tgz#4c740ae3c222823e7004096f832e7b93b2108270" + integrity sha512-QZ5BL8ZO/B20VA8APauGBg3GyEgZ19eduvpLWoq5x7gMmWnHoy8rlQWPLmWgFvo1yNgjSEFMesmS4R6pPr7xog== + dependencies: + iterall "^1.2.1" growly@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= -handlebars@^4.0.2, handlebars@^4.0.3, handlebars@^4.0.6: +handlebars@4.x.x, handlebars@^4.0.12, handlebars@^4.0.2, handlebars@^4.0.3, handlebars@^4.0.6: version "4.0.12" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.12.tgz#2c15c8a96d46da5e266700518ba8cb8d919d5bc5" integrity sha512-RhmTekP+FZL+XNhwS1Wf+bTTZpdLougwt5pcgA1tuz6Jcx0fpH/7z0qd71RKnZHBCxIRBHfBOnio4gViPemNzA== @@ -4405,6 +5891,75 @@ handlebars@^4.0.2, handlebars@^4.0.3, handlebars@^4.0.6: optionalDependencies: uglify-js "^3.1.4" +hapi-api-version@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/hapi-api-version/-/hapi-api-version-2.1.0.tgz#96b29c1a652380e34b6d7ee12a1484c4a056a9c1" + integrity sha512-Pcm//wgcI2FUG8YYd9xYT60wFNM1nexJ6lonfdYsvkXr1/yREUlo0SUR1g7jUZ6Oa//K1HQlJhFpbmN+2DIVVw== + dependencies: + boom "^5.2.0" + hoek "^4.2.0" + joi "^10.6.0" + media-type "^0.3.0" + +hapi-pagination@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/hapi-pagination/-/hapi-pagination-2.0.1.tgz#aef33ec4510257612a0b9be3855f77aa6a9635a3" + integrity sha512-7X+d7DcQ/Lef8MZ5HxlMk7kRk0+6ne4aR5lDP6d9obFPZB4K/pfGqJWvhgQeVCkHwKYe0ts6StdCRPLo8EQ2Pw== + dependencies: + boom "^7.1.1" + hapi "^17.1.1" + hoek "^5.0.2" + joi "^13.0.2" + +"hapi-pagination@https://github.com/faustbrian/hapi-pagination": + version "2.0.0" + resolved "https://github.com/faustbrian/hapi-pagination#c3a666ee2404be11bab879f316239ad352329ca1" + dependencies: + boom "^7.1.1" + hapi "^17.1.1" + hoek "^5.0.2" + joi "^13.0.2" + +hapi-rate-limit@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/hapi-rate-limit/-/hapi-rate-limit-3.0.0.tgz#70d121e2007e3736dfd679f1373eed32289834a2" + integrity sha512-AvzAH3nMSh0t11a69PpCHjuVSKi6/J0kOT7lN68XAi5Yo/K9VD3svjYCH+Fy1dfRwQRgnaXOxJQHUDvkf2sRYw== + dependencies: + boom "^7.2.0" + joi "^14.3.0" + +hapi-trailing-slash@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/hapi-trailing-slash/-/hapi-trailing-slash-3.0.1.tgz#e3b07a6aedbdb5a6a2351b3e3b179f3dbf29b2ab" + integrity sha512-EA+IVYyNKr/CO/pHlWEB9SRtzYOBXXjFb9l8vrJ0vS4hNcmYsajEk7FJk4R+HzmqR1wkJLW/gTAsOffSm9hPuw== + dependencies: + useragent "^2.2.1" + wreck "^14.0.2" + +hapi@^17.1.1, hapi@^17.8.1: + version "17.8.1" + resolved "https://registry.yarnpkg.com/hapi/-/hapi-17.8.1.tgz#63cc5bbc138b6ae0919e977764647a17556e4c87" + integrity sha512-0zfkl8YtJPfkOG+1KwFnZOk7/mmO2LrExJLWIJwzmwsyxLcQXNrnfwgk205xxxg9tnOO6OdCTQLkPG8Wn+McXw== + dependencies: + accept "3.x.x" + ammo "3.x.x" + boom "7.x.x" + bounce "1.x.x" + call "5.x.x" + catbox "10.x.x" + catbox-memory "3.x.x" + heavy "6.x.x" + hoek "6.x.x" + joi "14.x.x" + mimos "4.x.x" + podium "3.x.x" + shot "4.x.x" + somever "2.x.x" + statehood "6.x.x" + subtext "6.x.x" + teamwork "3.x.x" + topo "3.x.x" + har-schema@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" @@ -4531,6 +6086,15 @@ hawk@~3.1.3: hoek "2.x.x" sntp "1.x.x" +heavy@6.x.x: + version "6.1.2" + resolved "https://registry.yarnpkg.com/heavy/-/heavy-6.1.2.tgz#e5d56f18170a37b01d4381bc07fece5edc68520b" + integrity sha512-cJp884bqhiebNcEHydW0g6V1MUGYOXRPw9c7MFiHQnuGxtbWuSZpsbojwb2kxb3AA1/Rfs8CNiV9MMOF8pFRDg== + dependencies: + boom "7.x.x" + hoek "6.x.x" + joi "14.x.x" + highlight.js@^9.0.0: version "9.13.1" resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.13.1.tgz#054586d53a6863311168488a0f58d6c505ce641e" @@ -4550,6 +6114,21 @@ hoek@2.x.x: resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" integrity sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0= +hoek@4.2.x, hoek@4.x.x, hoek@^4.2.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.1.tgz#9634502aa12c445dd5a7c5734b572bb8738aacbb" + integrity sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA== + +hoek@5.x.x, hoek@^5.0.2: + version "5.0.4" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-5.0.4.tgz#0f7fa270a1cafeb364a4b2ddfaa33f864e4157da" + integrity sha512-Alr4ZQgoMlnere5FZJsIyfIjORBqZll5POhDsF4q64dPuJR6rNxXdDxtHSQq8OXRurhmx+PWYEE8bXRROY8h0w== + +hoek@6.x.x, hoek@^6.1.1: + version "6.1.2" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-6.1.2.tgz#99e6d070561839de74ee427b61aa476bd6bddfd6" + integrity sha512-6qhh/wahGYZHFSFw12tBbJw5fsAhhwrrG/y3Cs0YMTv2WzMnL0oLPnQJjv1QJvEfylRSOFuP+xCu+tdx0tD16Q== + home-or-tmp@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" @@ -4580,6 +6159,11 @@ http-cache-semantics@^3.8.1: resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz#39b0e16add9b605bf0a9ef3d9daaf4843b4cacd2" integrity sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w== +http-cache-semantics@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz#6c2ef57e22090b177828708a52eaeae9d1d63e1b" + integrity sha512-OO/9K7uFN30qwAKvslzmCTbimZ/uRjtdN5S50vvWLwUKqFuZj0n96XyCzF5tHRHEO/Q4JYC01hv41gkX06gmHA== + http-errors@1.6.3, http-errors@~1.6.2, http-errors@~1.6.3: version "1.6.3" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" @@ -4590,6 +6174,17 @@ http-errors@1.6.3, http-errors@~1.6.2, http-errors@~1.6.3: setprototypeof "1.1.0" statuses ">= 1.4.0 < 2" +http-errors@^1.7.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.1.tgz#6a4ffe5d35188e1c39f872534690585852e1f027" + integrity sha512-jWEUgtZWGSMba9I1N3gc1HmvpBUaNC9vDdA46yScAdp+C5rdEuKWUBLWTQpW9FwSWSbYYs++b6SDCxf9UEJzfw== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + http-proxy-agent@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz#e4821beef5b2142a2026bd73926fe537631c5405" @@ -4666,7 +6261,7 @@ iconv-lite@0.4.24, iconv-lite@^0.4.17, iconv-lite@^0.4.24, iconv-lite@^0.4.4, ic dependencies: safer-buffer ">= 2.1.2 < 3" -ieee754@^1.1.4: +ieee754@^1.1.4, ieee754@^1.1.8: version "1.1.12" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.12.tgz#50bf24e5b9c8bb98af4964c941cdb0918da7b60b" integrity sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA== @@ -4693,6 +6288,11 @@ immediate@~3.0.5: resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" integrity sha1-nbHb0Pr43m++D13V5Wu2BigN5ps= +immutable@^4.0.0-rc.12: + version "4.0.0-rc.12" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.0.0-rc.12.tgz#ca59a7e4c19ae8d9bf74a97bdf0f6e2f2a5d0217" + integrity sha512-0M2XxkZLx/mi3t8NVwIm1g8nHoEmM9p9UBl/G9k4+hm0kBgOVdMV/B3CY5dQ8qG8qc80NN4gDV4HQv6FTJ5q7A== + import-fresh@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" @@ -4744,6 +6344,23 @@ indexof@0.0.1: resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10= +inert@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/inert/-/inert-5.1.2.tgz#0c26f15bc22aae7af9c1f1a164bf867c58c5f4a6" + integrity sha512-5jSCKrQ7ENfdECnzLatCejXSkJwVzKFXZW30fI6TNHFbDuigT8IilRfydI2H5j9ZTnH7vXKO4WUg2qph9bItow== + dependencies: + ammo "3.x.x" + boom "7.x.x" + bounce "1.x.x" + hoek "6.x.x" + joi "14.x.x" + lru-cache "4.1.x" + +inflection@1.12.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/inflection/-/inflection-1.12.0.tgz#a200935656d6f5f6bc4dc7502e1aecb703228416" + integrity sha1-ogCTVlbW9fa8TcdQLhrstwMihBY= + inflight@^1.0.4, inflight@~1.0.5: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -4834,6 +6451,16 @@ inquirer@^6.2.0: strip-ansi "^5.0.0" through "^2.3.6" +int64-buffer@^0.1.9: + version "0.1.10" + resolved "https://registry.yarnpkg.com/int64-buffer/-/int64-buffer-0.1.10.tgz#277b228a87d95ad777d07c13832022406a473423" + integrity sha1-J3siiofZWtd30HwTgyAiQGpHNCM= + +integer@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/integer/-/integer-2.1.0.tgz#29134ea2f7ba3362ed4dbe6bcca992b1f18ff276" + integrity sha512-vBtiSgrEiNocWvvZX1RVfeOKa2mCHLZQ2p9nkQkQZ/BvEiY+6CcUz0eyjvIiewjJoeNidzg2I+tpPJvpyspL1w== + interpret@^1.0.0, interpret@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614" @@ -4866,6 +6493,16 @@ ipaddr.js@1.8.0: resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.0.tgz#eaa33d6ddd7ace8f7f6fe0c9ca0440e706738b1e" integrity sha1-6qM9bd16zo9/b+DJygRA5wZzix4= +iron@5.x.x: + version "5.0.6" + resolved "https://registry.yarnpkg.com/iron/-/iron-5.0.6.tgz#7121d4a6e3ac2f65e4d02971646fea1995434744" + integrity sha512-zYUMOSkEXGBdwlV/AXF9zJC0aLuTJUKHkGeYS5I2g225M5i6SrxQyGJGhPgOR8BK1omL6N5i6TcwfsXbP8/Exw== + dependencies: + b64 "4.x.x" + boom "7.x.x" + cryptiles "4.x.x" + hoek "6.x.x" + is-accessor-descriptor@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" @@ -4885,6 +6522,11 @@ is-arrayish@^0.2.1: resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + is-binary-path@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" @@ -4892,6 +6534,11 @@ is-binary-path@^1.0.0: dependencies: binary-extensions "^1.0.0" +is-bluebird@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-bluebird/-/is-bluebird-1.0.2.tgz#096439060f4aa411abee19143a84d6a55346d6e2" + integrity sha1-CWQ5Bg9KpBGr7hkUOoTWpVNG1uI= + is-buffer@^1.0.2, is-buffer@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" @@ -5128,6 +6775,11 @@ is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" +is-port-reachable@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-port-reachable/-/is-port-reachable-2.0.0.tgz#54d13d654917eb433ae3ee2dcbc3774f2cd44eb2" + integrity sha1-VNE9ZUkX60M64+4ty8N3TyzUTrI= + is-posix-bracket@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" @@ -5148,6 +6800,21 @@ is-property@^1.0.0, is-property@^1.0.2: resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" integrity sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ= +is-reachable@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-reachable/-/is-reachable-3.0.0.tgz#73ac3e3ff1d77af49b1dcd8d02a4bcf2721a4cec" + integrity sha512-bviQzO/xMpY1HV/4vLdLQ2waQu8D9elkNZTKsA1UOlWytU7XnLKP8Yn6GOkoZ52VEiwCCkj7biBhKGbgjtyDRg== + dependencies: + arrify "^1.0.1" + got "^9.3.2" + is-port-reachable "^2.0.0" + p-any "^1.1.0" + p-timeout "^2.0.1" + port-numbers "^4.0.4" + prepend-http "^2.0.0" + router-ips "^1.0.0" + url-parse "^1.4.4" + is-redirect@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" @@ -5224,6 +6891,23 @@ isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= +isemail@2.x.x: + version "2.2.1" + resolved "https://registry.yarnpkg.com/isemail/-/isemail-2.2.1.tgz#0353d3d9a62951080c262c2aa0a42b8ea8e9e2a6" + integrity sha1-A1PT2aYpUQgMJiwqoKQrjqjp4qY= + +isemail@3.x.x: + version "3.2.0" + resolved "https://registry.yarnpkg.com/isemail/-/isemail-3.2.0.tgz#59310a021931a9fb06bbb51e155ce0b3f236832c" + integrity sha512-zKqkK+O+dGqevc93KNsbZ/TqTUFd46MwWjYOoMrjIMZ51eU7DtQG3Wmd9SQQT7i7RVnuTPEiYEWHU3MSbxC1Tg== + dependencies: + punycode "2.x.x" + +iserror@^0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/iserror/-/iserror-0.0.2.tgz#bd53451fe2f668b9f2402c1966787aaa2c7c0bf5" + integrity sha1-vVNFH+L2aLnyQCwZZnh6qix8C/U= + isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" @@ -5316,6 +7000,16 @@ istanbul-reports@^1.5.1: dependencies: handlebars "^4.0.3" +items@2.x.x: + version "2.1.2" + resolved "https://registry.yarnpkg.com/items/-/items-2.1.2.tgz#0849354595805d586dac98e7e6e85556ea838558" + integrity sha512-kezcEqgB97BGeZZYtX/MA8AG410ptURstvnz5RAgyFZ8wQFPMxHY8GpTq+/ZHKT3frSlIthUq7EvLt9xn3TvXg== + +iterall@^1.1.3, iterall@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/iterall/-/iterall-1.2.2.tgz#92d70deb8028e0c39ff3164fdbf4d8b088130cd7" + integrity sha512-yynBb1g+RFUPY64fTrFv7nsjRrENBQJaX2UL+2Szc9REFrSNm1rpSXHGzhmAy7a9uv3vlvgBlXnf9RqmPH1/DA== + jest-changed-files@^23.4.2: version "23.4.2" resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-23.4.2.tgz#1eed688370cd5eebafe4ae93d34bb3b64968fe83" @@ -5509,6 +7203,13 @@ jest-message-util@^23.4.0: slash "^1.0.0" stack-utils "^1.0.1" +jest-mock-process@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/jest-mock-process/-/jest-mock-process-1.1.0.tgz#0a6f2751bbbd1acc4aa5a3d2fdf707b5d68931a2" + integrity sha512-9B15X9DoAmig5t3bGugOjtJnNHVGSYKALKN7G7/BB5BqRB35F8vKH10ns7ELlZ0XtVv1YfG6e0Yj+g7Qd6JILw== + dependencies: + jest "^23.4.2" + jest-mock@^23.2.0: version "23.2.0" resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-23.2.0.tgz#ad1c60f29e8719d47c26e1138098b6d18b261134" @@ -5643,7 +7344,7 @@ jest-worker@^23.2.0: dependencies: merge-stream "^1.0.1" -jest@^23.6.0: +jest@^23.4.2, jest@^23.6.0: version "23.6.0" resolved "https://registry.yarnpkg.com/jest/-/jest-23.6.0.tgz#ad5835e923ebf6e19e7a1d7529a432edfee7813d" integrity sha512-lWzcd+HSiqeuxyhG+EnZds6iO3Y3ZEnMrfZq/OTGvF/C+Z4fPMCdhWTGSAiO2Oym9rbEXfwddHhh6jqrTF3+Lw== @@ -5656,6 +7357,48 @@ jju@^1.1.0: resolved "https://registry.yarnpkg.com/jju/-/jju-1.4.0.tgz#a3abe2718af241a2b2904f84a625970f389ae32a" integrity sha1-o6vicYryQaKykE+EpiWXDzia4yo= +jmespath@^0.15.0: + version "0.15.0" + resolved "https://registry.yarnpkg.com/jmespath/-/jmespath-0.15.0.tgz#a3f222a9aae9f966f5d27c796510e28091764217" + integrity sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc= + +joi@12.x.x: + version "12.0.0" + resolved "https://registry.yarnpkg.com/joi/-/joi-12.0.0.tgz#46f55e68f4d9628f01bbb695902c8b307ad8d33a" + integrity sha512-z0FNlV4NGgjQN1fdtHYXf5kmgludM65fG/JlXzU6+rwkt9U5UWuXVYnXa2FpK0u6+qBuCmrm5byPNuiiddAHvQ== + dependencies: + hoek "4.x.x" + isemail "3.x.x" + topo "2.x.x" + +joi@13.x.x, joi@^13.0.2: + version "13.7.0" + resolved "https://registry.yarnpkg.com/joi/-/joi-13.7.0.tgz#cfd85ebfe67e8a1900432400b4d03bbd93fb879f" + integrity sha512-xuY5VkHfeOYK3Hdi91ulocfuFopwgbSORmIwzcwHKESQhC7w1kD5jaVSPnqDxS2I8t3RZ9omCKAxNwXN5zG1/Q== + dependencies: + hoek "5.x.x" + isemail "3.x.x" + topo "3.x.x" + +joi@14.x.x, joi@^14.3.0: + version "14.3.0" + resolved "https://registry.yarnpkg.com/joi/-/joi-14.3.0.tgz#55f7c5caa8256de74ccb12eb22ab1c19eea02db3" + integrity sha512-0HKd1z8MWogez4GaU0LkY1FgW30vR2Kwy414GISfCU41OYgUC2GWpNe5amsvBZtDqPtt7DohykfOOMIw1Z5hvQ== + dependencies: + hoek "6.x.x" + isemail "3.x.x" + topo "3.x.x" + +joi@^10.6.0: + version "10.6.0" + resolved "https://registry.yarnpkg.com/joi/-/joi-10.6.0.tgz#52587f02d52b8b75cdb0c74f0b164a191a0e1fc2" + integrity sha512-hBF3LcqyAid+9X/pwg+eXjD2QBZI5eXnBFJYaAkH4SK3mp9QSRiiQnDYlmlz5pccMvnLcJRS4whhDOTCkmsAdQ== + dependencies: + hoek "4.x.x" + isemail "2.x.x" + items "2.x.x" + topo "2.x.x" + js-levenshtein@^1.1.3: version "1.1.4" resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.4.tgz#3a56e3cbf589ca0081eb22cd9ba0b1290a16d26e" @@ -5731,6 +7474,11 @@ jsesc@~0.5.0: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= +json-buffer@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" + integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= + json-parse-better-errors@^1.0.0, json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" @@ -5753,7 +7501,14 @@ json-schema@0.2.3: resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= -json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: +json-stable-stringify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" + integrity sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8= + dependencies: + jsonify "~0.0.0" + +json-stringify-safe@5.0.x, json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= @@ -5784,6 +7539,11 @@ jsonfile@^4.0.0: optionalDependencies: graceful-fs "^4.1.6" +jsonify@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= + jsonparse@^1.2.0: version "1.3.1" resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" @@ -5815,6 +7575,13 @@ jszip@^3.1.5: pako "~1.0.2" readable-stream "~2.0.6" +keyv@^3.0.0, keyv@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" + integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== + dependencies: + json-buffer "3.0.0" + kind-of@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-2.0.1.tgz#018ec7a4ce7e3a86cb9141be519d24c8faa981b5" @@ -5851,6 +7618,13 @@ kleur@^2.0.1: resolved "https://registry.yarnpkg.com/kleur/-/kleur-2.0.2.tgz#b704f4944d95e255d038f0cb05fb8a602c55a300" integrity sha512-77XF9iTllATmG9lSlIv0qdQ2BQ/h9t0bJllHlbvsQ0zUWfU7Yi0S8L5JXzPZgkefIiajLmBJJ4BsMJmqcf7oxQ== +kuler@1.0.x: + version "1.0.1" + resolved "https://registry.yarnpkg.com/kuler/-/kuler-1.0.1.tgz#ef7c784f36c9fb6e16dd3150d152677b2b0228a6" + integrity sha512-J9nVUucG1p/skKul6DU3PUZrhs0LPulNaeUOox0IyXDi8S4CztTHs1gQphhuZmzXG7VOQSf6NJfKuzteQLv9gQ== + dependencies: + colornames "^1.1.1" + latest-version@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15" @@ -5905,7 +7679,7 @@ lerna@^3.5.0: import-local "^1.0.0" libnpm "^2.0.1" -leven@^2.1.0: +leven@2.1.0, leven@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580" integrity sha1-wuep93IJTe6dNCAq6KzORoeHVYA= @@ -6198,6 +7972,16 @@ lodash.assignin@^4.2.0: resolved "https://registry.yarnpkg.com/lodash.assignin/-/lodash.assignin-4.2.0.tgz#ba8df5fb841eb0a3e8044232b0e263a8dc6a28a2" integrity sha1-uo31+4QesKPoBEIysOJjqNxqKKI= +lodash.camelcase@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY= + +lodash.chunk@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.chunk/-/lodash.chunk-4.2.0.tgz#66e5ce1f76ed27b4303d8c6512e8d1216e8106bc" + integrity sha1-ZuXOH3btJ7QwPYxlEujRIW6BBrw= + lodash.clone@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.clone/-/lodash.clone-4.5.0.tgz#195870450f5a13192478df4bc3d23d2dea1907b6" @@ -6208,11 +7992,31 @@ lodash.clonedeep@^4.3.0, lodash.clonedeep@^4.5.0, lodash.clonedeep@~4.5.0: resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= +lodash.clonedeepwith@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clonedeepwith/-/lodash.clonedeepwith-4.5.0.tgz#6ee30573a03a1a60d670a62ef33c10cf1afdbdd4" + integrity sha1-buMFc6A6GmDWcKYu8zwQzxr9vdQ= + +lodash.compact@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash.compact/-/lodash.compact-3.0.1.tgz#540ce3837745975807471e16b4a2ba21e7256ca5" + integrity sha1-VAzjg3dFl1gHRx4WtKK6IeclbKU= + lodash.debounce@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= +lodash.fill@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/lodash.fill/-/lodash.fill-3.4.0.tgz#a3c74ae640d053adf0dc2079f8720788e8bfef85" + integrity sha1-o8dK5kDQU63w3CB5+HIHiOi/74U= + +lodash.first@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash.first/-/lodash.first-3.0.0.tgz#5dae180d7f818ee65fc5b210b104a7bbef98a16a" + integrity sha1-Xa4YDX+BjuZfxbIQsQSnu++YoWo= + lodash.flatten@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" @@ -6223,16 +8027,91 @@ lodash.get@^4.4.2: resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= +lodash.groupby@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.groupby/-/lodash.groupby-4.6.0.tgz#0b08a1dcf68397c397855c3239783832df7403d1" + integrity sha1-Cwih3PaDl8OXhVwyOXg4Mt90A9E= + +lodash.head@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.head/-/lodash.head-4.0.1.tgz#e2aa322d3ec40cd6aae186082977d993b354ed9c" + integrity sha1-4qoyLT7EDNaq4YYIKXfZk7NU7Zw= + +lodash.isempty@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.isempty/-/lodash.isempty-4.4.0.tgz#6f86cbedd8be4ec987be9aaf33c9684db1b31e7e" + integrity sha1-b4bL7di+TsmHvpqvM8loTbGzHn4= + +lodash.isequal@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" + integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA= + +lodash.isfunction@^3.0.8, lodash.isfunction@~3.0.8: + version "3.0.9" + resolved "https://registry.yarnpkg.com/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz#06de25df4db327ac931981d1bdb067e5af68d051" + integrity sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw== + +lodash.isnumber@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc" + integrity sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w= + +lodash.isstring@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" + integrity sha1-1SfftUVuynzJu5XV2ur4i6VKVFE= + +lodash.last@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash.last/-/lodash.last-3.0.0.tgz#242f663112dd4c6e63728c60a3c909d1bdadbd4c" + integrity sha1-JC9mMRLdTG5jcoxgo8kJ0b2tvUw= + +lodash.orderby@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.orderby/-/lodash.orderby-4.6.0.tgz#e697f04ce5d78522f54d9338b32b81a3393e4eb3" + integrity sha1-5pfwTOXXhSL1TZM4syuBozk+TrM= + +lodash.pick@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3" + integrity sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM= + +lodash.sample@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/lodash.sample/-/lodash.sample-4.2.1.tgz#5e4291b0c753fa1abeb0aab8fb29df1b66f07f6d" + integrity sha1-XkKRsMdT+hq+sKq4+ynfG2bwf20= + lodash.set@^4.3.2: version "4.3.2" resolved "https://registry.yarnpkg.com/lodash.set/-/lodash.set-4.3.2.tgz#d8757b1da807dde24816b0d6a84bea1a76230b23" integrity sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM= +lodash.shuffle@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.shuffle/-/lodash.shuffle-4.2.0.tgz#145b5053cf875f6f5c2a33f48b6e9948c6ec7b4b" + integrity sha1-FFtQU8+HX29cKjP0i26ZSMbse0s= + +lodash.snakecase@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz#39d714a35357147837aefd64b5dcbb16becd8f8d" + integrity sha1-OdcUo1NXFHg3rv1ktdy7Fr7Nj40= + lodash.sortby@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= +lodash.sumby@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.sumby/-/lodash.sumby-4.6.0.tgz#7d87737ddb216da2f7e5e7cd2dd9c403a7887346" + integrity sha1-fYdzfdshbaL35efNLdnEA6eIc0Y= + +lodash.take@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.take/-/lodash.take-4.1.1.tgz#0b4146dcb7a70c6153495187fc10b12b71fefadf" + integrity sha1-C0FG3LenDGFTSVGH/BCxK3H++t8= + lodash.template@^4.0.2: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.4.0.tgz#e73a0385c8355591746e020b99679c690e68fba0" @@ -6248,12 +8127,17 @@ lodash.templatesettings@^4.0.0: dependencies: lodash._reinterpolate "~3.0.0" +lodash.toarray@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.toarray/-/lodash.toarray-4.4.0.tgz#24c4bfcd6b2fba38bfd0594db1179d8e9b656561" + integrity sha1-JMS/zWsvuji/0FlNsRedjptlZWE= + lodash.union@~4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88" integrity sha1-SLtQiECfFvGCFmZkHETdGqrjzYg= -lodash.uniq@~4.5.0: +lodash.uniq@^4.5.0, lodash.uniq@~4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= @@ -6263,12 +8147,17 @@ lodash.without@~4.4.0: resolved "https://registry.yarnpkg.com/lodash.without/-/lodash.without-4.4.0.tgz#3cd4574a00b67bae373a94b748772640507b7aac" integrity sha1-PNRXSgC2e643OpS3SHcmQFB7eqw= +lodash@4.1.x: + version "4.1.0" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.1.0.tgz#299894283de01a9eefbedff4c4b9b00a6a2e6e96" + integrity sha1-KZiUKD3gGp7vvt/0xLmwCmoubpY= + lodash@4.17.10: version "4.17.10" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" integrity sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg== -lodash@^4, lodash@^4.13.1, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0: +lodash@^4, lodash@^4.13.1, lodash@^4.15.0, lodash@^4.17.1, lodash@^4.17.10, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0: version "4.17.11" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== @@ -6296,6 +8185,27 @@ log-update@^2.3.0: cli-cursor "^2.0.0" wrap-ansi "^3.0.1" +logform@^1.6.0, logform@^1.9.1: + version "1.10.0" + resolved "https://registry.yarnpkg.com/logform/-/logform-1.10.0.tgz#c9d5598714c92b546e23f4e78147c40f1e02012e" + integrity sha512-em5ojIhU18fIMOw/333mD+ZLE2fis0EzXl1ZwHx4iQzmpQi6odNiY/t+ITNr33JZhT9/KEaH+UPIipr6a9EjWg== + dependencies: + colors "^1.2.1" + fast-safe-stringify "^2.0.4" + fecha "^2.3.3" + ms "^2.1.1" + triple-beam "^1.2.0" + +long@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" + integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== + +long@~3: + version "3.2.0" + resolved "https://registry.yarnpkg.com/long/-/long-3.2.0.tgz#d821b7138ca1cb581c172990ef14db200b5c474b" + integrity sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s= + loose-envify@^1.0.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" @@ -6311,12 +8221,26 @@ loud-rejection@^1.0.0: currently-unhandled "^0.4.1" signal-exit "^3.0.0" -lowercase-keys@^1.0.0: +lout@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/lout/-/lout-11.1.0.tgz#4c48b6b068b42197acb6420d79b856095d174589" + integrity sha512-HAowXHOraHWEPrYPuNc7mR8v1Sn1Gnmy8uvpXYDidVHsTMlrkxqUZ1liBXGOf4eN22kVB+eG29NWymPhZG/wKg== + dependencies: + boom "7.x.x" + handlebars "4.x.x" + hoek "5.x.x" + +lower-case@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" + integrity sha1-miyr0bno4K6ZOkv31YdcOcQujqw= + +lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== -lru-cache@^4.0.0, lru-cache@^4.0.1, lru-cache@^4.1.2, lru-cache@^4.1.3: +lru-cache@4.1.x, lru-cache@^4.0.0, lru-cache@^4.0.1, lru-cache@^4.1.2, lru-cache@^4.1.3: version "4.1.5" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== @@ -6324,6 +8248,18 @@ lru-cache@^4.0.0, lru-cache@^4.0.1, lru-cache@^4.1.2, lru-cache@^4.1.3: pseudomap "^1.0.2" yallist "^2.1.2" +lru-cache@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +lsmod@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lsmod/-/lsmod-1.0.0.tgz#9a00f76dca36eb23fa05350afe1b585d4299e64b" + integrity sha1-mgD3bco26yP6BTUK/htYXUKZ5ks= + macos-release@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/macos-release/-/macos-release-1.1.0.tgz#831945e29365b470aa8724b0ab36c8f8959d10fb" @@ -6365,6 +8301,11 @@ makeerror@1.0.x: dependencies: tmpl "1.0.x" +manakin@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/manakin/-/manakin-0.5.2.tgz#abe3df430ca6085f6983f6e4cf5af0298f4d30cc" + integrity sha512-pfDSB7QYoVg0Io4KMV9hhPoXpj6p0uBscgtyUSKCOFZe8bqgbpStfgnKIbF/ulnr6U3ICu4OqdyxAqBgOhZwBQ== + map-age-cleaner@^0.1.1: version "0.1.3" resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" @@ -6420,6 +8361,11 @@ md5.js@^1.3.4: inherits "^2.0.1" safe-buffer "^5.1.2" +media-type@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/media-type/-/media-type-0.3.1.tgz#5d569cdd0c52d9c41c7c6451973edd267fb21bcb" + integrity sha1-XVac3QxS2cQcfGRRlz7dJn+yG8s= + media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" @@ -6480,6 +8426,21 @@ meow@^4.0.0: redent "^2.0.0" trim-newlines "^2.0.0" +meow@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/meow/-/meow-5.0.0.tgz#dfc73d63a9afc714a5e371760eb5c88b91078aa4" + integrity sha512-CbTqYU17ABaLefO8vCU153ZZlprKYWDljcndKKDCFcYQITzWCXZAVk4QMFZPgvzrnUQ3uItnIE/LoUOwrT15Ig== + dependencies: + camelcase-keys "^4.0.0" + decamelize-keys "^1.0.0" + loud-rejection "^1.0.0" + minimist-options "^3.0.1" + normalize-package-data "^2.3.4" + read-pkg-up "^3.0.0" + redent "^2.0.0" + trim-newlines "^2.0.0" + yargs-parser "^10.0.0" + merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" @@ -6553,7 +8514,7 @@ miller-rabin@^4.0.0: bn.js "^4.0.0" brorand "^1.0.1" -mime-db@~1.37.0: +mime-db@1.x.x, mime-db@~1.37.0: version "1.37.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.37.0.tgz#0b6a0ce6fdbe9576e25f1f2d2fde8830dc0ad0d8" integrity sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg== @@ -6575,6 +8536,19 @@ mimic-fn@^1.0.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== +mimic-response@^1.0.0, mimic-response@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" + integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== + +mimos@4.x.x: + version "4.0.2" + resolved "https://registry.yarnpkg.com/mimos/-/mimos-4.0.2.tgz#f2762d7c60118ce51c2231afa090bc335d21d0f8" + integrity sha512-5XBsDqBqzSN88XPPH/TFpOalWOjHJM5Z2d3AMx/30iq+qXvYKd/8MPhqBwZDOLtoaIWInR3nLzMQcxfGK9djXA== + dependencies: + hoek "6.x.x" + mime-db "1.x.x" + minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" @@ -6674,6 +8648,23 @@ modify-values@^1.0.0: resolved "https://registry.yarnpkg.com/modify-values/-/modify-values-1.0.1.tgz#b3939fa605546474e3e3e3c63d64bd43b4ee6022" integrity sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw== +moment-timezone@^0.5.14: + version "0.5.23" + resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.23.tgz#7cbb00db2c14c71b19303cb47b0fb0a6d8651463" + integrity sha512-WHFH85DkCfiNMDX5D3X7hpNH3/PUhjTGcD0U1SgfBGZxJ3qUmJh5FdvaFjcClxOvB3rzdfj4oRffbI38jEnC1w== + dependencies: + moment ">= 2.9.0" + +moment@2.20.x: + version "2.20.1" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.20.1.tgz#d6eb1a46cbcc14a2b2f9434112c1ff8907f313fd" + integrity sha512-Yh9y73JRljxW5QxN08Fner68eFLxM5ynNOAw2LbIB1YAGeQzZT8QFSUvkAz609Zf+IHhhaUxqZK8dG3W/+HEvg== + +"moment@>= 2.9.0", moment@^2.11.2, moment@^2.20.0: + version "2.23.0" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.23.0.tgz#759ea491ac97d54bac5ad776996e2a58cc1bc225" + integrity sha512-3IE39bHVqFbWWaPOMHZF98Q9c3LDKGTmypMiTM2QygGXXElkFWIH7GxfmlwmY2vwa+wmNsoYZmG2iusf1ZjJoA== + move-concurrently@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" @@ -6686,6 +8677,11 @@ move-concurrently@^1.0.1: rimraf "^2.5.4" run-queue "^1.0.3" +mri@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/mri/-/mri-1.1.1.tgz#85aa26d3daeeeedf80dc5984af95cc5ca5cad9f1" + integrity sha1-haom09ru7t+A3FmEr5XMXKXK2fE= + ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" @@ -6696,6 +8692,16 @@ ms@^2.0.0, ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== +msgpack-lite@^0.1.26: + version "0.1.26" + resolved "https://registry.yarnpkg.com/msgpack-lite/-/msgpack-lite-0.1.26.tgz#dd3c50b26f059f25e7edee3644418358e2a9ad89" + integrity sha1-3TxQsm8FnyXn7e42REGDWOKprYk= + dependencies: + event-lite "^0.1.1" + ieee754 "^1.1.8" + int64-buffer "^0.1.9" + isarray "^1.0.0" + multimatch@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-2.1.0.tgz#9c7906a22fb4c02919e2f5f75161b4cdbd4b2a2b" @@ -6711,11 +8717,16 @@ mute-stream@0.0.7, mute-stream@~0.0.4: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= -nan@^2.9.2: +nan@^2.10.0, nan@^2.2.1, nan@^2.9.2: version "2.11.1" resolved "https://registry.yarnpkg.com/nan/-/nan-2.11.1.tgz#90e22bccb8ca57ea4cd37cc83d3819b52eea6766" integrity sha512-iji6k87OSXa0CcrLl9z+ZiYSuR2o+c0bGuNmXdrhTQTakxytAFsC56SArGYoiHlJlFoHSnvmhpceZJaXkVuOtA== +nan@~2.10.0: + version "2.10.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f" + integrity sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA== + nanomatch@^1.2.9: version "1.2.13" resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" @@ -6767,6 +8778,11 @@ neo-async@^2.5.0: resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.0.tgz#b9d15e4d71c6762908654b5183ed38b753340835" integrity sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA== +nested-error-stacks@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/nested-error-stacks/-/nested-error-stacks-2.1.0.tgz#0fbdcf3e13fe4994781280524f8b96b0cdff9c61" + integrity sha512-AO81vsIO1k1sM4Zrd6Hu7regmJN1NSiAja10gc4bX3F0wd+9rQmcuHQaHVQCYIEC8iFXnE+mavh23GOt7wBgug== + netmask@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/netmask/-/netmask-1.0.6.tgz#20297e89d86f6f6400f250d9f4f6b4c1945fcd35" @@ -6782,6 +8798,21 @@ nice-try@^1.0.4: resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== +nigel@3.x.x: + version "3.0.4" + resolved "https://registry.yarnpkg.com/nigel/-/nigel-3.0.4.tgz#edcd82f2e9387fe34ba21e3127ae4891547c7945" + integrity sha512-3SZCCS/duVDGxFpTROHEieC+itDo4UqL9JNUyQJv3rljudQbK6aqus5B4470OxhESPJLN93Qqxg16rH7DUjbfQ== + dependencies: + hoek "6.x.x" + vise "3.x.x" + +no-case@^2.2.0: + version "2.3.2" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac" + integrity sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ== + dependencies: + lower-case "^1.1.1" + node-alias@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/node-alias/-/node-alias-1.0.4.tgz#1f1b916b56b9ea241c0135f97ced6940f556f292" @@ -6790,6 +8821,13 @@ node-alias@^1.0.4: chalk "^1.1.1" lodash "^4.2.0" +node-emoji@^1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.8.1.tgz#6eec6bfb07421e2148c75c6bba72421f8530a826" + integrity sha512-+ktMAh1Jwas+TnGodfCfjUbJKoANqPaJFN0z0iqh41eqD8dvguNzcitVSBSVK1pidz0AqGbLKcoVuVLRVZ/aVg== + dependencies: + lodash.toarray "^4.4.0" + node-fetch-npm@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/node-fetch-npm/-/node-fetch-npm-2.0.2.tgz#7258c9046182dca345b4208eda918daf33697ff7" @@ -6799,6 +8837,16 @@ node-fetch-npm@^2.0.2: json-parse-better-errors "^1.0.0" safe-buffer "^5.1.1" +node-fetch@^2.1.2, node-fetch@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.3.0.tgz#1a1d940bbfb916a1d3e0219f037e89e71f8c5fa5" + integrity sha512-MOd8pV3fxENbryESLgVIeaGKrdl+uaYhCSSVkjeOb/31/njTpcis5aWfdqgNlHIrKOLRbMnfPINPOML2CIFeXA== + +node-forge@^0.7.6: + version "0.7.6" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.7.6.tgz#fdf3b418aee1f94f0ef642cd63486c77ca9724ac" + integrity sha512-sol30LUpz1jQFBjOKwbjxijiE3b6pjd74YwfD0fJOKPjF+fONKb2Yg8rYgS6+bK6VDl+/wfr4IYpC7jDzLUIfw== + node-gyp@^3.8.0: version "3.8.0" resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.8.0.tgz#540304261c330e80d0d5edce253a68cb3964218c" @@ -6881,7 +8929,7 @@ node-notifier@^5.2.1: shellwords "^0.1.1" which "^1.3.0" -node-pre-gyp@^0.10.0: +node-pre-gyp@^0.10.0, node-pre-gyp@^0.10.3: version "0.10.3" resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc" integrity sha512-d1xFs+C/IPS8Id0qPTZ4bUT8wWryfR/OzzAFxweG+uLN85oPzyo2Iw6bVlLQ/JOdgNonXLCoRyqDzDWq4iw72A== @@ -6956,6 +9004,11 @@ normalize-path@^2.0.1, normalize-path@^2.1.1: dependencies: remove-trailing-separator "^1.0.1" +normalize-url@^3.1.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" + integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== + npm-bundled@^1.0.1: version "1.0.5" resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.5.tgz#3c1732b7ba936b3a10325aef616467c0ccbcc979" @@ -7276,11 +9329,21 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" +object-hash@^1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-1.3.1.tgz#fde452098a951cb145f039bb7d455449ddc126df" + integrity sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA== + object-keys@^1.0.12: version "1.0.12" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.12.tgz#09c53855377575310cca62f55bb334abff7b3ed2" integrity sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag== +object-path@^0.11.4: + version "0.11.4" + resolved "https://registry.yarnpkg.com/object-path/-/object-path-0.11.4.tgz#370ae752fbf37de3ea70a861c23bba8915691949" + integrity sha1-NwrnUvvzfePqcKhhwju6iRVpGUk= + object-visit@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" @@ -7325,6 +9388,11 @@ once@^1.3.0, once@^1.3.1, once@^1.3.3, once@^1.4.0, once@~1.4.0: dependencies: wrappy "1" +one-time@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/one-time/-/one-time-0.0.4.tgz#f8cdf77884826fe4dff93e3a9cc37b1e4480742e" + integrity sha1-+M33eISCb+Tf+T46nMN7HkSAdC4= + onetime@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" @@ -7344,6 +9412,13 @@ opn@^5.2.0: dependencies: is-wsl "^1.1.0" +oppsy@2.x.x: + version "2.0.0" + resolved "https://registry.yarnpkg.com/oppsy/-/oppsy-2.0.0.tgz#3a194517adc24c3c61cdc56f35f4537e93a35e34" + integrity sha1-OhlFF63CTDxhzcVvNfRTfpOjXjQ= + dependencies: + hoek "5.x.x" + optimist@^0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" @@ -7420,6 +9495,25 @@ osenv@0, osenv@^0.1.4, osenv@^0.1.5, osenv@~0.1.3: os-homedir "^1.0.0" os-tmpdir "^1.0.0" +otplib@^10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/otplib/-/otplib-10.0.1.tgz#d37fcd13203298c0b94937d55c5a3527ed877875" + integrity sha512-FtbKelYtio2af5LDBWz3bWS6T03taHJAIv3evMrXuvoM50z5jbWoEMabPCk0A0JqiLGBzAIDJWfR9gSsvRYZHA== + dependencies: + thirty-two "1.0.2" + +p-any@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/p-any/-/p-any-1.1.0.tgz#1d03835c7eed1e34b8e539c47b7b60d0d015d4e1" + integrity sha512-Ef0tVa4CZ5pTAmKn+Cg3w8ABBXh+hHO1aV8281dKOoUHfX+3tjG2EaFcC+aZyagg9b4EYGsHEjz21DnEE8Og2g== + dependencies: + p-some "^2.0.0" + +p-cancelable@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.0.0.tgz#07e9c6d22c31f9c6784cb4f1e1454a79b6d9e2d6" + integrity sha512-USgPoaC6tkTGlS831CxsVdmZmyb8tR1D+hStI84MyckLOzfJlYQUweomrwE3D8T7u5u5GVuW064LT501wHTYYA== + p-defer@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" @@ -7490,6 +9584,20 @@ p-reduce@^1.0.0: resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa" integrity sha1-GMKw3ZNqRpClKfgjH1ig/bakffo= +p-some@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/p-some/-/p-some-2.0.1.tgz#65d87c8b154edbcf5221d167778b6d2e150f6f06" + integrity sha1-Zdh8ixVO289SIdFnd4ttLhUPbwY= + dependencies: + aggregate-error "^1.0.0" + +p-timeout@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-2.0.1.tgz#d8dd1979595d2dc0139e1fe46b8b646cb3cdf038" + integrity sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA== + dependencies: + p-finally "^1.0.0" + p-try@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" @@ -7542,6 +9650,11 @@ package-json@^4.0.0: registry-url "^3.0.3" semver "^5.1.0" +packet-reader@0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/packet-reader/-/packet-reader-0.3.1.tgz#cd62e60af8d7fea8a705ec4ff990871c46871f27" + integrity sha1-zWLmCvjX/qinBexP+ZCHHEaHHyc= + pacote@^9.2.3: version "9.2.3" resolved "https://registry.yarnpkg.com/pacote/-/pacote-9.2.3.tgz#48cfe87beb9177acd6594355a584a538835424b3" @@ -7630,6 +9743,11 @@ parse-json@^4.0.0: error-ex "^1.3.1" json-parse-better-errors "^1.0.1" +parse-ms@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-2.0.0.tgz#7b3640295100caf3fa0100ccceb56635b62f9d62" + integrity sha512-AddiXFSLLCqj+tCRJ9MrUtHZB4DWojO3tk0NVZ+g5MaMQHF2+p2ktqxuoXyPFLljz/aUK0Nfhd/uGWnhXVXEyA== + parse5@4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" @@ -7723,7 +9841,7 @@ path@0.12.7: process "^0.11.1" util "^0.10.3" -pbkdf2@^3.0.3: +pbkdf2@^3.0.3, pbkdf2@^3.0.9: version "3.0.17" resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6" integrity sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA== @@ -7734,21 +9852,99 @@ pbkdf2@^3.0.3: safe-buffer "^5.0.1" sha.js "^2.4.8" -performance-now@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" - integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + +pez@4.x.x: + version "4.0.5" + resolved "https://registry.yarnpkg.com/pez/-/pez-4.0.5.tgz#a975c49deff330d298d82851b39f81c2710556df" + integrity sha512-HvL8uiFIlkXbx/qw4B8jKDCWzo7Pnnd65Uvanf9OOCtb20MRcb9gtTVBf9NCnhETif1/nzbDHIjAWC/sUp7LIQ== + dependencies: + b64 "4.x.x" + boom "7.x.x" + content "4.x.x" + hoek "6.x.x" + nigel "3.x.x" + +pg-connection-string@0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-0.1.3.tgz#da1847b20940e42ee1492beaf65d49d91b245df7" + integrity sha1-2hhHsglA5C7hSSvq9l1J2RskXfc= + +pg-cursor@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/pg-cursor/-/pg-cursor-1.3.0.tgz#b220f1908976b7b40daa373c7ada5fca823ab0d9" + integrity sha1-siDxkIl2t7QNqjc8etpfyoI6sNk= + +pg-minify@0.5.5: + version "0.5.5" + resolved "https://registry.yarnpkg.com/pg-minify/-/pg-minify-0.5.5.tgz#6c961a61aa19f469d8edfe5a3c0da58760f3c339" + integrity sha512-7Pf9h6nV1RFqED1hkRosePqvpPwNUUtW06TT4+lHwzesxa5gffxkShTjYH6JXV5sSSfh5+2yHOTTWEkCyCQ0Eg== + +pg-pool@^2.0.4: + version "2.0.5" + resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-2.0.5.tgz#f00556fab23f1bbb14b0650ba8d0e447434a1b04" + integrity sha512-T4W9qzP2LjItXuXbW6jgAF2AY0jHp6IoTxRhM3GB7yzfBxzDnA3GCm0sAduzmmiCybMqD0+V1HiqIG5X2YWqlQ== + +pg-promise@^8.5.4: + version "8.5.4" + resolved "https://registry.yarnpkg.com/pg-promise/-/pg-promise-8.5.4.tgz#3c1c656d340b1d8e21bbd8017a650c795b375aca" + integrity sha512-GjGEL5WuRJOjTdTiI/v8x4SUd+nLh/fnAgKa8GvMi6xNKLaxvXOC6PiVj53n/oppUN6QjewGh06RBod4VrXhGQ== + dependencies: + manakin "0.5.2" + pg "7.7.1" + pg-minify "0.5.5" + spex "2.1.0" + +pg-query-stream@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/pg-query-stream/-/pg-query-stream-1.1.2.tgz#d089ff633b9ece40712f4f76da25ac253d88ec96" + integrity sha512-84hsUVjbrvXYIpVH+6FrKajfOnmTo7Wc/CXPtSyv41JmUnLcQ2lcVrkR7+m4VPtL28FdcZA7Q7ab4X0za4BhrQ== + dependencies: + pg-cursor "1.3.0" + +pg-types@~1.12.1: + version "1.12.1" + resolved "https://registry.yarnpkg.com/pg-types/-/pg-types-1.12.1.tgz#d64087e3903b58ffaad279e7595c52208a14c3d2" + integrity sha1-1kCH45A7WP+q0nnnWVxSIIoUw9I= + dependencies: + postgres-array "~1.0.0" + postgres-bytea "~1.0.0" + postgres-date "~1.0.0" + postgres-interval "^1.1.0" + +pg@7.7.1: + version "7.7.1" + resolved "https://registry.yarnpkg.com/pg/-/pg-7.7.1.tgz#546b192ff484322b69689391f885de3ba91a30d4" + integrity sha512-p3I0mXOmUvCoVlCMFW6iYSrnguPol6q8He15NGgSIdM3sPGjFc+8JGCeKclw8ZR4ETd+Jxy2KNiaPUcocHZeMw== + dependencies: + buffer-writer "2.0.0" + packet-reader "0.3.1" + pg-connection-string "0.1.3" + pg-pool "^2.0.4" + pg-types "~1.12.1" + pgpass "1.x" + semver "4.3.2" + +pgpass@1.x: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pgpass/-/pgpass-1.0.2.tgz#2a7bb41b6065b67907e91da1b07c1847c877b306" + integrity sha1-Knu0G2BltnkH6R2hsHwYR8h3swY= + dependencies: + split "^1.0.0" + +pify@3.0.0, pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= pify@^2.0.0, pify@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= -pify@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" - integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= - pinkie-promise@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" @@ -7761,6 +9957,40 @@ pinkie@^2.0.0: resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= +pino-pretty@^2.3.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/pino-pretty/-/pino-pretty-2.5.0.tgz#fade5b6d2acbdbf2c7e77adf220e7b7d89d04437" + integrity sha512-odR4SKdyubhe4aFts0/mBau2/mJLG23Ghyo86a+GZ2/Cev3CRr5nYv2+82V7v1hQL93yRSO004ASrrF7278TNQ== + dependencies: + args "^5.0.0" + chalk "^2.3.2" + dateformat "^3.0.3" + fast-json-parse "^1.0.3" + fast-safe-stringify "^2.0.6" + jmespath "^0.15.0" + pump "^3.0.0" + readable-stream "^3.0.6" + split2 "^3.0.0" + +pino-std-serializers@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pino-std-serializers/-/pino-std-serializers-2.3.0.tgz#34eeaab97c055c28e22c0542ae55978e7e427786" + integrity sha512-klfGoOsP6sJH7ON796G4xoUSx2fkpFgKHO4YVVO2zmz31jR+etzc/QzGJILaOIiCD6HTCFgkPx+XN8nk+ruqPw== + +pino@^5.10.1: + version "5.10.1" + resolved "https://registry.yarnpkg.com/pino/-/pino-5.10.1.tgz#24831a60681622f96f16df723b48eb6802fcd993" + integrity sha512-a2pXIoYfEpQaGKR87/iY97jRjAqSVCyULyNsYJLTXCXbout4qGe2tvAz9jHlm1kMVwOw3IYVZ2baKP8GvLMeiw== + dependencies: + fast-json-parse "^1.0.3" + fast-redact "^1.4.2" + fast-safe-stringify "^2.0.6" + flatstr "^1.0.9" + pino-std-serializers "^2.3.0" + pump "^3.0.0" + quick-format-unescaped "^3.0.0" + sonic-boom "^0.7.1" + pkg-dir@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" @@ -7782,16 +10012,56 @@ please-upgrade-node@^3.0.2, please-upgrade-node@^3.1.1: dependencies: semver-compare "^1.0.0" +pluralize@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" + integrity sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow== + pn@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA== +podium@3.x.x: + version "3.2.0" + resolved "https://registry.yarnpkg.com/podium/-/podium-3.2.0.tgz#2a7c579ddd5408f412d014c9ffac080c41d83477" + integrity sha512-rbwvxwVkI6gRRlxZQ1zUeafrpGxZ7QPHIheinehAvGATvGIPfWRkaTeWedc5P4YjXJXEV8ZbBxPtglNylF9hjw== + dependencies: + hoek "6.x.x" + joi "14.x.x" + +port-numbers@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/port-numbers/-/port-numbers-4.0.4.tgz#fe1c1fa7cd551f4ceb835b3bbf88c07baa0783d7" + integrity sha512-iicgo0Gltog+OinSw/ESmKOLi4Kfus/OQ6KfN4iOObYVh/Ap13PlFIBulPooBMKnEVm2SUO3Fs2Lk6T9culk1Q== + posix-character-classes@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= +postgres-array@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/postgres-array/-/postgres-array-1.0.3.tgz#c561fc3b266b21451fc6555384f4986d78ec80f5" + integrity sha512-5wClXrAP0+78mcsNX3/ithQ5exKvCyK5lr5NEEEeGwwM6NJdQgzIJBVxLvRW+huFpX92F2QnZ5CcokH0VhK2qQ== + +postgres-bytea@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/postgres-bytea/-/postgres-bytea-1.0.0.tgz#027b533c0aa890e26d172d47cf9ccecc521acd35" + integrity sha1-AntTPAqokOJtFy1Hz5zOzFIazTU= + +postgres-date@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/postgres-date/-/postgres-date-1.0.3.tgz#e2d89702efdb258ff9d9cee0fe91bd06975257a8" + integrity sha1-4tiXAu/bJY/52c7g/pG9BpdSV6g= + +postgres-interval@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/postgres-interval/-/postgres-interval-1.1.2.tgz#bf71ff902635f21cb241a013fc421d81d1db15a9" + integrity sha512-fC3xNHeTskCxL1dC8KOtxXt7YeFmlbTYtn7ul8MkVERuTmf7pI4DrkAxcw3kh1fQ9uz4wQmd03a1mRiXUZChfQ== + dependencies: + xtend "^4.0.0" + prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" @@ -7802,6 +10072,11 @@ prepend-http@^1.0.1: resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= +prepend-http@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" + integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= + preserve@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" @@ -7828,6 +10103,13 @@ pretty-format@^23.6.0: ansi-regex "^3.0.0" ansi-styles "^3.2.0" +pretty-ms@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-4.0.0.tgz#31baf41b94fd02227098aaa03bd62608eb0d6e92" + integrity sha512-qG66ahoLCwpLXD09ZPHSCbUWYTqdosB7SMP4OffgTgL2PBKXMuUsrk5Bwg8q4qPkjTXsKBMr+YK3Ltd/6F9s/Q== + dependencies: + parse-ms "^2.0.0" + private@^0.1.6, private@^0.1.8: version "0.1.8" resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" @@ -7893,6 +10175,25 @@ proto-list@~1.2.1: resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" integrity sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk= +protobufjs@^6.8.6: + version "6.8.8" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.8.8.tgz#c8b4f1282fd7a90e6f5b109ed11c84af82908e7c" + integrity sha512-AAmHtD5pXgZfi7GMpllpO3q1Xw1OYldr+dMUlAnffGTAhqkg72WdmSY71uKBF/JuyiKs8psYbtKrhi0ASCD8qw== + dependencies: + "@protobufjs/aspromise" "^1.1.2" + "@protobufjs/base64" "^1.1.2" + "@protobufjs/codegen" "^2.0.4" + "@protobufjs/eventemitter" "^1.1.0" + "@protobufjs/fetch" "^1.1.0" + "@protobufjs/float" "^1.0.2" + "@protobufjs/inquire" "^1.1.0" + "@protobufjs/path" "^1.1.2" + "@protobufjs/pool" "^1.1.0" + "@protobufjs/utf8" "^1.1.0" + "@types/long" "^4.0.0" + "@types/node" "^10.1.0" + long "^4.0.0" + protoduck@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/protoduck/-/protoduck-5.0.1.tgz#03c3659ca18007b69a50fd82a7ebcc516261151f" @@ -7970,6 +10271,15 @@ pump@^3.0.0: end-of-stream "^1.1.0" once "^1.3.1" +pumpify@1.3.x: + version "1.3.6" + resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.3.6.tgz#00d40e5ded0a3bf1e0788b1c0cf426a42882ab64" + integrity sha512-BurGAcvezsINL5US9T9wGHHcLNrG6MCp//ECtxron3vcR+Rfx5Anqq7HbZXNJvFQli8FGVsWCAvywEJFV5Hx/Q== + dependencies: + duplexify "^3.5.3" + inherits "^2.0.3" + pump "^2.0.0" + pumpify@^1.3.3: version "1.5.1" resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" @@ -7984,15 +10294,20 @@ punycode@1.3.2: resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= +punycode@2.x.x, punycode@^2.1.0, punycode@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + punycode@^1.2.4, punycode@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= -punycode@^2.1.0, punycode@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== +pure-uuid@1.5.3: + version "1.5.3" + resolved "https://registry.yarnpkg.com/pure-uuid/-/pure-uuid-1.5.3.tgz#cafee7e95b5ff96d7fb737346214967e009d5bce" + integrity sha512-Wqgq/EtTicstn7g9siPbZ4O1s2Zh9EY9Ccn/doRiDDfMRy6l9AuvJILOq4PeT84FTDOpzrmP3rEd/XVRpRa9Zw== q@^1.5.1: version "1.5.1" @@ -8019,11 +10334,28 @@ querystring@0.2.0: resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= +querystringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.1.0.tgz#7ded8dfbf7879dcc60d0a644ac6754b283ad17ef" + integrity sha512-sluvZZ1YiTLD5jsqZcDmFyV2EwToyXZBfpoVOmktMmW+VEnhgakFHnasVph65fOjGPTWN0Nw3+XQaSeMayr0kg== + +quick-format-unescaped@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/quick-format-unescaped/-/quick-format-unescaped-3.0.1.tgz#e1e8526f6aa56dc5452926111461e85755f79acf" + integrity sha512-Tnk4iJQ8x3V8ml3x9sLIf4tSDaVB9OJY/5gOrnxgK63CXKphhn8oYOPI4tqnXPQcZ3tCv7GFjeoYY5h6UAvuzg== + quick-lru@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-1.1.0.tgz#4360b17c61136ad38078397ff11416e186dcfbb8" integrity sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g= +random-seed@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/random-seed/-/random-seed-0.3.0.tgz#d945f2e1f38f49e8d58913431b8bf6bb937556cd" + integrity sha1-2UXy4fOPSejViRNDG4v2u5N1Vs0= + dependencies: + json-stringify-safe "^5.0.1" + randomatic@^3.0.0: version "3.1.1" resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.1.tgz#b776efc59375984e36c537b2f51a1f0aff0da1ed" @@ -8048,6 +10380,13 @@ randomfill@^1.0.3: randombytes "^2.0.5" safe-buffer "^5.1.0" +randomstring@~1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/randomstring/-/randomstring-1.1.5.tgz#6df0628f75cbd5932930d9fe3ab4e956a18518c3" + integrity sha1-bfBij3XL1ZMpMNn+OrTpVqGFGMM= + dependencies: + array-uniq "1.0.2" + range-parser@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" @@ -8214,6 +10553,15 @@ readable-stream@1.1.x: isarray "0.0.1" string_decoder "~0.10.x" +readable-stream@^3.0.0, readable-stream@^3.0.6: + version "3.0.6" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.0.6.tgz#351302e4c68b5abd6a2ed55376a7f9a25be3057a" + integrity sha512-9E1oLoOWfhSXHGv6QlwXJim7uNzd9EVlWK+21tCU9Ju/kR0/p2AZYPz4qSchgO8PlLIH4FpZYfzwS+rEksZjIg== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + readable-stream@~2.0.5, readable-stream@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e" @@ -8502,6 +10850,11 @@ require-main-filename@^1.0.1: resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= + resolve-cwd@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" @@ -8536,6 +10889,13 @@ resolve@1.x, resolve@^1.1.6, resolve@^1.3.2: dependencies: path-parse "^1.0.5" +responselike@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" + integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec= + dependencies: + lowercase-keys "^1.0.0" + restore-cursor@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" @@ -8549,6 +10909,19 @@ ret@~0.1.10: resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== +retry-as-promised@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/retry-as-promised/-/retry-as-promised-2.3.2.tgz#cd974ee4fd9b5fe03cbf31871ee48221c07737b7" + integrity sha1-zZdO5P2bX+A8vzGHHuSCIcB3N7c= + dependencies: + bluebird "^3.4.6" + debug "^2.6.9" + +retry@0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= + retry@^0.10.0, retry@~0.10.0: version "0.10.1" resolved "https://registry.yarnpkg.com/retry/-/retry-0.10.1.tgz#e76388d217992c252750241d3d3956fed98d8ff4" @@ -8576,6 +10949,11 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: hash-base "^3.0.0" inherits "^2.0.1" +router-ips@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/router-ips/-/router-ips-1.0.0.tgz#44e00858ebebc0133d58e40b2cd8a1fbb04203f5" + integrity sha1-ROAIWOvrwBM9WOQLLNih+7BCA/U= + rsvp@^3.3.3: version "3.6.2" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.2.tgz#2e96491599a96cde1b515d5674a8f7a91452926a" @@ -8674,6 +11052,25 @@ schema-utils@^1.0.0: ajv-errors "^1.0.0" ajv-keywords "^3.1.0" +scryptsy@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/scryptsy/-/scryptsy-2.0.0.tgz#262c36f0231cfa7654e2363fa394cd2dec66f378" + integrity sha1-Jiw28CMc+nZU4jY/o5TNLexm83g= + +secp256k1@^3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-3.5.2.tgz#f95f952057310722184fe9c914e6b71281f2f2ae" + integrity sha512-iin3kojdybY6NArd+UFsoTuapOF7bnJNf2UbcWXaY3z+E1sJDipl60vtzB5hbO/uquBu7z0fd4VC4Irp+xoFVQ== + dependencies: + bindings "^1.2.1" + bip66 "^1.1.3" + bn.js "^4.11.3" + create-hash "^1.1.2" + drbg.js "^1.0.1" + elliptic "^6.2.3" + nan "^2.2.1" + safe-buffer "^5.1.0" + secure-keys@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/secure-keys/-/secure-keys-1.0.0.tgz#f0c82d98a3b139a8776a8808050b824431087fca" @@ -8701,6 +11098,11 @@ semver-utils@^1.1.1: resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== +semver@4.3.2: + version "4.3.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.2.tgz#c7a07158a80bedd052355b770d82d6640f803be7" + integrity sha1-x6BxWKgL7dBSNVt3DYLWZA+AO+c= + semver@^4.1.0: version "4.3.6" resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" @@ -8730,6 +11132,29 @@ send@0.16.2: range-parser "~1.2.0" statuses "~1.4.0" +sequelize@^4.41.2: + version "4.42.0" + resolved "https://registry.yarnpkg.com/sequelize/-/sequelize-4.42.0.tgz#439467ba7bfe7d5afcc56d62b3e091860fbf18f3" + integrity sha512-qxAYnX4rcv7PbNtEidb56REpxNJCdbN0qyk1jb3+e6sE7OrmS0nYMU+MFVbNTJtZfSpOEEL1TX0TkMw+wzZBxg== + dependencies: + bluebird "^3.5.0" + cls-bluebird "^2.1.0" + debug "^3.1.0" + depd "^1.1.0" + dottie "^2.0.0" + generic-pool "^3.4.0" + inflection "1.12.0" + lodash "^4.17.1" + moment "^2.20.0" + moment-timezone "^0.5.14" + retry-as-promised "^2.3.2" + semver "^5.5.0" + terraformer-wkt-parser "^1.1.2" + toposort-class "^1.0.1" + uuid "^3.2.1" + validator "^10.4.0" + wkx "^0.4.1" + serialize-javascript@^1.4.0: version "1.5.0" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.5.0.tgz#1aa336162c88a890ddad5384baebc93a655161fe" @@ -8832,6 +11257,19 @@ shellwords@^0.1.1: resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== +shimmer@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shimmer/-/shimmer-1.2.0.tgz#f966f7555789763e74d8841193685a5e78736665" + integrity sha512-xTCx2vohXC2EWWDqY/zb4+5Mu28D+HYNSOuFzsyRDRvI/e1ICb69afwaUwfjr+25ZXldbOLyp+iDUZHq8UnTag== + +shot@4.x.x: + version "4.0.7" + resolved "https://registry.yarnpkg.com/shot/-/shot-4.0.7.tgz#b05d2858634fedc18ece99e8f638fab7c9f9d4c4" + integrity sha512-RKaKAGKxJ11EjJl0cf2fYVSsd4KB5Cncb9J0v7w+0iIaXpxNqFWTYNDNhBX7f0XSyDrjOH9a4OWZ9Gp/ZML+ew== + dependencies: + hoek "6.x.x" + joi "14.x.x" + signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" @@ -8844,6 +11282,13 @@ simple-git@^1.85.0: dependencies: debug "^4.0.1" +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo= + dependencies: + is-arrayish "^0.3.1" + sisteransi@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-0.1.1.tgz#5431447d5f7d1675aac667ccd0b865a4994cb3ce" @@ -8864,6 +11309,11 @@ slice-ansi@0.0.4: resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" integrity sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU= +sliced@0.0.x: + version "0.0.5" + resolved "https://registry.yarnpkg.com/sliced/-/sliced-0.0.5.tgz#5edc044ca4eb6f7816d50ba2fc63e25d8fe4707f" + integrity sha1-XtwETKTrb3gW1Qui/GPiXY/kcH8= + slide@^1.1.3, slide@^1.1.5, slide@^1.1.6, slide@~1.1.3, slide@~1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" @@ -8916,6 +11366,16 @@ sntp@1.x.x: dependencies: hoek "2.x.x" +sntp@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/sntp/-/sntp-3.0.2.tgz#3f0b5de6115681dce82a9478691f0e5c552de5a3" + integrity sha512-MCAPpBPFjNp1fwDVCLSRuWuH9gONtb2R+lS1esC6Mp8lP6jy60FVUtP/Qr0jBvcWAVbhzx06y1b6ptXiy32dug== + dependencies: + boom "7.x.x" + bounce "1.x.x" + hoek "6.x.x" + teamwork "3.x.x" + snyk-config@2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/snyk-config/-/snyk-config-2.2.0.tgz#d400ce50e293ce5c3ade4cf46a53bea8205771e6" @@ -9144,6 +11604,21 @@ socks@~2.2.0: ip "^1.1.5" smart-buffer "^4.0.1" +somever@2.x.x: + version "2.0.0" + resolved "https://registry.yarnpkg.com/somever/-/somever-2.0.0.tgz#7bdbed3bee8ece2c7c8a2e7d9a1c022bd98d6c89" + integrity sha512-9JaIPP+HxwYGqCDqqK3tRaTqdtQHoK6Qy3IrXhIt2q5x8fs8RcfU7BMWlFTCOgFazK8p88zIv1tHQXvAwtXMyw== + dependencies: + bounce "1.x.x" + hoek "6.x.x" + +sonic-boom@^0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-0.7.1.tgz#d6aae30428802dbd43b1167643efe1ef708bb534" + integrity sha512-zveqTNcDTI35ae0LgK/SwHkFeMfe6FJKyeACgPzuOe3f+9CyaoXJHTnDgekXt8PKIoMCGF/m57/9RNjjkqmt2A== + dependencies: + flatstr "^1.0.9" + sort-keys@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-2.0.0.tgz#658535584861ec97d730d6cf41822e1f56684128" @@ -9233,6 +11708,11 @@ spdx-license-ids@^3.0.0: resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.2.tgz#a59efc09784c2a5bada13cfeaf5c75dd214044d2" integrity sha512-qky9CVt0lVIECkEsYbNILVnPvycuEBkXoMFLRWsREkomQLevYhtRKC+R91a5TOAQ3bCMjikRwhyaRqj1VYatYg== +spex@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/spex/-/spex-2.1.0.tgz#21939ab7722322c3a1d002870fab022daa79335f" + integrity sha512-nZ1LA8v1o0Maf9pdWKUXuUM855EqyE+DP0NT0ddZqXqXmr9xKlXjYWN97w+yWehTbM+Ox0aEvQ8Ufqk/OuLCOQ== + split-string@^3.0.1, split-string@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" @@ -9247,6 +11727,13 @@ split2@^2.0.0: dependencies: through2 "^2.0.2" +split2@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split2/-/split2-3.1.0.tgz#064bbfac70cdb66f77827870d42f159a8b442201" + integrity sha512-ePE1otNQVMnBRyqf3INbZvZwBPGsdBDThgrOWZ6z8zXGNVQNVCSEoOO9aBMTzDN1mXoNSZJ2kHSFH7AA5SPWww== + dependencies: + readable-stream "^3.0.0" + split@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9" @@ -9259,6 +11746,32 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= +sql@^0.78.0, sql@~0.78.0: + version "0.78.0" + resolved "https://registry.yarnpkg.com/sql/-/sql-0.78.0.tgz#894585d56111dbb1768741a4d9935c82c8595949" + integrity sha1-iUWF1WER27F2h0Gk2ZNcgshZWUk= + dependencies: + lodash "4.1.x" + sliced "0.0.x" + +sqlite3@4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/sqlite3/-/sqlite3-4.0.2.tgz#1bbeb68b03ead5d499e42a3a1b140064791c5a64" + integrity sha512-51ferIRwYOhzUEtogqOa/y9supADlAht98bF/gbIi6WkzRJX6Yioldxbzj1MV4yV+LgdKD/kkHwFTeFXOG4htA== + dependencies: + nan "~2.10.0" + node-pre-gyp "^0.10.3" + request "^2.87.0" + +sqlite3@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/sqlite3/-/sqlite3-4.0.4.tgz#1f75e3ededad6e26f7dd819929460ce44a49dfcd" + integrity sha512-CO8vZMyUXBPC+E3iXOCc7Tz2pAdq5BWfLcQmOokCOZW5S5sZ/paijiPOCdvzpdP83RroWHYa5xYlVqCxSqpnQg== + dependencies: + nan "~2.10.0" + node-pre-gyp "^0.10.3" + request "^2.87.0" + sshpk@^1.7.0: version "1.15.2" resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.15.2.tgz#c946d6bd9b1a39d0e8635763f5242d6ed6dcb629" @@ -9281,16 +11794,45 @@ ssri@^6.0.0, ssri@^6.0.1: dependencies: figgy-pudding "^3.5.1" +stack-generator@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/stack-generator/-/stack-generator-2.0.3.tgz#bb74385c67ffc4ccf3c4dee5831832d4e509c8a0" + integrity sha512-kdzGoqrnqsMxOEuXsXyQTmvWXZmG0f3Ql2GDx5NtmZs59sT2Bt9Vdyq0XdtxUi58q/+nxtbF9KOQ9HkV1QznGg== + dependencies: + stackframe "^1.0.4" + +stack-trace@0.0.10, stack-trace@0.0.x: + version "0.0.10" + resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" + integrity sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA= + stack-utils@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.2.tgz#33eba3897788558bebfc2db059dc158ec36cebb8" integrity sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA== +stackframe@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.0.4.tgz#357b24a992f9427cba6b545d96a14ed2cbca187b" + integrity sha512-to7oADIniaYwS3MhtCa/sQhrxidCCQiF/qp4/m5iN3ipf0Y7Xlri0f6eG29r08aL7JYl8n32AF3Q5GYBZ7K8vw== + staged-git-files@1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/staged-git-files/-/staged-git-files-1.1.2.tgz#4326d33886dc9ecfa29a6193bf511ba90a46454b" integrity sha512-0Eyrk6uXW6tg9PYkhi/V/J4zHp33aNyi2hOCmhFLqLTIhbgqWn5jlSzI+IU0VqrZq6+DbHcabQl/WP6P3BG0QA== +statehood@6.x.x: + version "6.0.8" + resolved "https://registry.yarnpkg.com/statehood/-/statehood-6.0.8.tgz#c8c3363694b207ab692d17ab5b48eebf47e13e10" + integrity sha512-/uk2Iq5VXCAGmYnRTjez6gDfU8fROm1Um5WH2C9aNCdG7DAqD94dqZgeuqXrvVFnfDqxAtorUBLUtD9El/uJ6w== + dependencies: + boom "7.x.x" + bounce "1.x.x" + cryptiles "4.x.x" + hoek "6.x.x" + iron "5.x.x" + joi "14.x.x" + static-extend@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" @@ -9299,7 +11841,7 @@ static-extend@^0.1.1: define-property "^0.2.5" object-copy "^0.1.0" -"statuses@>= 1.4.0 < 2": +"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2": version "1.5.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= @@ -9346,6 +11888,11 @@ stream-shift@^1.0.0: resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" integrity sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI= +streamsearch@0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-0.1.2.tgz#808b9d0e56fc273d809ba57338e929919a1a9f1a" + integrity sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo= + string-argv@^0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.0.2.tgz#dac30408690c21f3c3630a3ff3a05877bdcbd736" @@ -9376,7 +11923,7 @@ string-width@^1.0.1: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" -string_decoder@^1.0.0: +string_decoder@^1.0.0, string_decoder@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.2.0.tgz#fe86e738b19544afe70469243b2a1ee9240eae8d" integrity sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w== @@ -9479,6 +12026,35 @@ strong-log-transformer@^2.0.0: minimist "^1.2.0" through "^2.3.4" +subscriptions-transport-ws@^0.9.11: + version "0.9.15" + resolved "https://registry.yarnpkg.com/subscriptions-transport-ws/-/subscriptions-transport-ws-0.9.15.tgz#68a8b7ba0037d8c489fb2f5a102d1494db297d0d" + integrity sha512-f9eBfWdHsePQV67QIX+VRhf++dn1adyC/PZHP6XI5AfKnZ4n0FW+v5omxwdHVpd4xq2ZijaHEcmlQrhBY79ZWQ== + dependencies: + backo2 "^1.0.2" + eventemitter3 "^3.1.0" + iterall "^1.2.1" + symbol-observable "^1.0.4" + ws "^5.2.0" + +subtext@6.x.x: + version "6.0.11" + resolved "https://registry.yarnpkg.com/subtext/-/subtext-6.0.11.tgz#430de749b06fc5005d208ffd2668b5c7a1ca27ac" + integrity sha512-jap1ev33dbVTBPxpIyJ5OvD9/J4oWlx1qHQ8bBnKpiwItxXt3+7tvmNZqZeTEQVTjvkReHY1ZnP/7iltNdGnOA== + dependencies: + boom "7.x.x" + content "4.x.x" + hoek "6.x.x" + pez "4.x.x" + wreck "14.x.x" + +superheroes@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/superheroes/-/superheroes-2.0.0.tgz#8e18ea99b718973afb9b76afd213c7c0e0263537" + integrity sha512-yTQ2cZ5G/csR1WqF6NOVs3S/FYqj8Tc8TISSsyeBqddYnshX8fkeAfGA5WV4l3/yc7F/pMWVZWfFOzJrQ8Vpng== + dependencies: + unique-random-array "^1.0.0" + supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" @@ -9498,7 +12074,7 @@ supports-color@^5.3.0, supports-color@^5.5.0: dependencies: has-flag "^3.0.0" -symbol-observable@^1.1.0: +symbol-observable@^1.0.4, symbol-observable@^1.1.0, symbol-observable@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== @@ -9535,6 +12111,11 @@ tar@^4, tar@^4.4.6: safe-buffer "^5.1.2" yallist "^3.0.2" +teamwork@3.x.x: + version "3.0.3" + resolved "https://registry.yarnpkg.com/teamwork/-/teamwork-3.0.3.tgz#0c08748efe00c32c1eaf1128ef7f07ba0c7cc4ea" + integrity sha512-OCB56z+G70iA1A1OFoT+51TPzfcgN0ks75uN3yhxA+EU66WTz2BevNDK4YzMqfaL5tuAvxy4iFUn35/u8pxMaQ== + temp-dir@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d" @@ -9567,6 +12148,21 @@ term-size@^1.2.0: dependencies: execa "^0.7.0" +terraformer-wkt-parser@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/terraformer-wkt-parser/-/terraformer-wkt-parser-1.2.0.tgz#c9d6ac3dff25f4c0bd344e961f42694961834c34" + integrity sha512-QU3iA54St5lF8Za1jg1oj4NYc8sn5tCZ08aNSWDeGzrsaV48eZk1iAVWasxhNspYBoCqdHuoot1pUTUrE1AJ4w== + dependencies: + "@types/geojson" "^1.0.0" + terraformer "~1.0.5" + +terraformer@~1.0.5: + version "1.0.9" + resolved "https://registry.yarnpkg.com/terraformer/-/terraformer-1.0.9.tgz#77851fef4a49c90b345dc53cf26809fdf29dcda6" + integrity sha512-YlmQ1fsMWTkKGDGibCRWgmLzrpDRUr63Q025LJ/taYQ6j1Yb8q9McKF7NBi6ACAyUXO6F/bl9w6v4MY307y5Ag== + optionalDependencies: + "@types/geojson" "^1.0.0" + terser-webpack-plugin@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.1.0.tgz#cf7c25a1eee25bf121f4a587bb9e004e3f80e528" @@ -9606,6 +12202,11 @@ text-extensions@^1.0.0: resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-1.9.0.tgz#1853e45fee39c945ce6f6c36b2d659b5aabc2a26" integrity sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ== +text-hex@1.0.x: + version "1.0.0" + resolved "https://registry.yarnpkg.com/text-hex/-/text-hex-1.0.0.tgz#69dc9c1b17446ee79a92bf5b884bb4b9127506f5" + integrity sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg== + text-table@~0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" @@ -9618,6 +12219,11 @@ then-fs@^2.0.0: dependencies: promise ">=3.2 <8" +thirty-two@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/thirty-two/-/thirty-two-1.0.2.tgz#4ca2fffc02a51290d2744b9e3f557693ca6b627a" + integrity sha1-TKL//AKlEpDSdEueP1V2k8prYno= + throat@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" @@ -9653,7 +12259,33 @@ timers-browserify@^2.0.4: dependencies: setimmediate "^1.0.4" -tmp@0.0.33, tmp@^0.0.33: +timezone-support@^1.8.0: + version "1.8.1" + resolved "https://registry.yarnpkg.com/timezone-support/-/timezone-support-1.8.1.tgz#0a8c04d0614be6fccdd2280aaad5072fa5d31e5f" + integrity sha512-+pKzxoUe4PZXaQcswceJlA+69oRyyu1uivnYKdpsC7eGzZiuvTLbU4WYPqTKslEsoSvjN8k/u/6qNfGikBB/wA== + dependencies: + commander "2.19.0" + +tiny-glob@^0.2.3: + version "0.2.6" + resolved "https://registry.yarnpkg.com/tiny-glob/-/tiny-glob-0.2.6.tgz#9e056e169d9788fe8a734dfa1ff02e9b92ed7eda" + integrity sha512-A7ewMqPu1B5PWwC3m7KVgAu96Ch5LA0w4SnEN/LbDREj/gAD0nPWboRbn8YoP9ISZXqeNAlMvKSKoEuhcfK3Pw== + dependencies: + globalyzer "^0.1.0" + globrex "^0.1.1" + +tiny-secp256k1@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tiny-secp256k1/-/tiny-secp256k1-1.0.1.tgz#fc6f96529c22b92be91e12de4040fdd9245f7835" + integrity sha512-Wz2kMPWtCI5XBftFeF3bUL8uz2+VlasniKwOkRPjvL7h1QVd9rbhrve/HWUu747kJKzVf1XHonzcdM4Ut8fvww== + dependencies: + bindings "^1.3.0" + bn.js "^4.11.8" + create-hmac "^1.1.7" + elliptic "^6.4.0" + nan "^2.10.0" + +tmp@0.0.33, tmp@0.0.x, tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== @@ -9687,6 +12319,11 @@ to-object-path@^0.3.0: dependencies: kind-of "^3.0.2" +to-readable-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" + integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== + to-regex-range@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" @@ -9705,11 +12342,35 @@ to-regex@^3.0.1, to-regex@^3.0.2: regex-not "^1.0.2" safe-regex "^1.1.0" +toidentifier@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" + integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== + toml@^2.3.2: version "2.3.3" resolved "https://registry.yarnpkg.com/toml/-/toml-2.3.3.tgz#8d683d729577cb286231dfc7a8affe58d31728fb" integrity sha512-O7L5hhSQHxuufWUdcTRPfuTh3phKfAZ/dqfxZFoxPCj2RYmpaSGLEIs016FCXItQwNr08yefUB5TSjzRYnajTA== +topo@2.x.x: + version "2.0.2" + resolved "https://registry.yarnpkg.com/topo/-/topo-2.0.2.tgz#cd5615752539057c0dc0491a621c3bc6fbe1d182" + integrity sha1-zVYVdSU5BXwNwEkaYhw7xvvh0YI= + dependencies: + hoek "4.x.x" + +topo@3.x.x: + version "3.0.3" + resolved "https://registry.yarnpkg.com/topo/-/topo-3.0.3.tgz#d5a67fb2e69307ebeeb08402ec2a2a6f5f7ad95c" + integrity sha512-IgpPtvD4kjrJ7CRA3ov2FhWQADwv+Tdqbsf1ZnPUSAtCJ9e1Z44MmoSGDXGk4IppoZA7jd/QRkNddlLJWlUZsQ== + dependencies: + hoek "6.x.x" + +toposort-class@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toposort-class/-/toposort-class-1.0.1.tgz#7ffd1f78c8be28c3ba45cd4e1a3f5ee193bd9988" + integrity sha1-f/0feMi+KMO6Rc1OGj9e4ZO9mYg= + tough-cookie@>=2.3.3, tough-cookie@^2.3.4: version "2.5.0" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" @@ -9760,6 +12421,11 @@ trim-right@^1.0.1: resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= +triple-beam@^1.2.0, triple-beam@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/triple-beam/-/triple-beam-1.3.0.tgz#a595214c7298db8339eeeee083e4d10bd8cb8dd9" + integrity sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw== + ts-jest@^23.10.5: version "23.10.5" resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-23.10.5.tgz#cdb550df4466a30489bf70ba867615799f388dd5" @@ -9775,6 +12441,17 @@ ts-jest@^23.10.5: semver "^5.5" yargs-parser "10.x" +ts-loader@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-5.3.1.tgz#70614c8ec4354a9c8b89c9f97b2becb7a98a3980" + integrity sha512-fDDgpBH3SR8xlt2MasLdz3Yy611PQ/UY/KGyo7TgXhTRU/6sS8uGG0nJYnU1OdFBNKcoYbId1UTNaAOUn+i41g== + dependencies: + chalk "^2.3.0" + enhanced-resolve "^4.0.0" + loader-utils "^1.0.2" + micromatch "^3.1.4" + semver "^5.0.1" + tslib@^1, tslib@^1.8.0, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: version "1.9.3" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" @@ -9847,6 +12524,13 @@ type-is@~1.6.16: media-typer "0.3.0" mime-types "~2.1.18" +typechecker@^4.0.1, typechecker@^4.3.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/typechecker/-/typechecker-4.7.0.tgz#5249f427358f45b7250c4924fd4d01ed9ba435e9" + integrity sha512-4LHc1KMNJ6NDGO+dSM/yNfZQRtp8NN7psYrPHUblD62Dvkwsp3VShsbM78kOgpcmMkRTgvwdKOTjctS+uMllgQ== + dependencies: + editions "^2.1.0" + typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" @@ -9880,6 +12564,11 @@ typedoc@^0.13.0: typedoc-default-themes "^0.5.0" typescript "3.1.x" +typeforce@^1.11.5: + version "1.18.0" + resolved "https://registry.yarnpkg.com/typeforce/-/typeforce-1.18.0.tgz#d7416a2c5845e085034d70fcc5b6cc4a90edbfdc" + integrity sha512-7uc1O8h1M1g0rArakJdf0uLRSSgFcYexrVoKo+bzJd32gd4gDy2L/Z+8/FjPnU9ydY3pEnVPtr9FyscYY60K1g== + typescript@3.1.x: version "3.1.6" resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.1.6.tgz#b6543a83cfc8c2befb3f4c8fba6896f5b0c9be68" @@ -9908,6 +12597,14 @@ umask@^1.1.0, umask@~1.1.0: resolved "https://registry.yarnpkg.com/umask/-/umask-1.1.0.tgz#f29cebf01df517912bb58ff9c4e50fde8e33320d" integrity sha1-8pzr8B31F5ErtY/5xOUP3o4zMg0= +umzug@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/umzug/-/umzug-2.2.0.tgz#6160bdc1817e4a63a625946775063c638623e62e" + integrity sha512-xZLW76ax70pND9bx3wqwb8zqkFGzZIK8dIHD9WdNy/CrNfjWcwQgQkGCuUqcuwEBvUm+g07z+qWvY+pxDmMEEw== + dependencies: + babel-runtime "^6.23.0" + bluebird "^3.5.3" + undefsafe@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.2.tgz#225f6b9e0337663e0d8e7cfd686fc2836ccace76" @@ -9955,6 +12652,18 @@ unique-filename@^1.1.0, unique-filename@^1.1.1, unique-filename@~1.1.0: dependencies: unique-slug "^2.0.0" +unique-random-array@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/unique-random-array/-/unique-random-array-1.0.1.tgz#f29bda2a62be8860a703c4739c8f4fdb4d722cc7" + integrity sha512-z9J/SV8CUIhIRROcHe9YUoAT6XthUJt0oUyLGgobiXJprDP9O9dsErNevvSaAv5BkhwFEVPn6nIEOKeNE6Ck1Q== + dependencies: + unique-random "^1.0.0" + +unique-random@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unique-random/-/unique-random-1.0.0.tgz#ce3e224c8242cd33a0e77b0d7180d77e6b62d0c4" + integrity sha1-zj4iTIJCzTOg53sNcYDXfmti0MQ= + unique-slug@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.1.tgz#5e9edc6d1ce8fb264db18a507ef9bd8544451ca6" @@ -9974,6 +12683,11 @@ universalify@^0.1.0: resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== +unorm@^1.3.3: + version "1.4.1" + resolved "https://registry.yarnpkg.com/unorm/-/unorm-1.4.1.tgz#364200d5f13646ca8bcd44490271335614792300" + integrity sha1-NkIA1fE2RsqLzURJAnEzVhR5IwA= + unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" @@ -10013,6 +12727,11 @@ update-notifier@^2.1.0, update-notifier@^2.2.0, update-notifier@^2.5.0: semver-diff "^2.0.0" xdg-basedir "^3.0.0" +upper-case@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598" + integrity sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg= + uri-js@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" @@ -10032,6 +12751,21 @@ url-parse-lax@^1.0.0: dependencies: prepend-http "^1.0.1" +url-parse-lax@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" + integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww= + dependencies: + prepend-http "^2.0.0" + +url-parse@^1.4.4: + version "1.4.4" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.4.tgz#cac1556e95faa0303691fec5cf9d5a1bc34648f8" + integrity sha512-/92DTTorg4JjktLNLe6GPS2/RvAd/RGr6LuktmWSMLEOa6rjnlrFXNgSbSmkNvCoL2T028A0a1JaJLzRMlFoHg== + dependencies: + querystringify "^2.0.0" + requires-port "^1.0.0" + url@^0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" @@ -10050,7 +12784,15 @@ use@^3.1.0: resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== -util-deprecate@~1.0.1: +useragent@^2.2.1: + version "2.3.0" + resolved "https://registry.yarnpkg.com/useragent/-/useragent-2.3.0.tgz#217f943ad540cb2128658ab23fc960f6a88c9972" + integrity sha512-4AoH4pxuSvHCjqLO04sU6U/uE65BYza8l/KKBS0b0hnUPWi+cQ2BpeTEwejCSx9SPV5/U03nniDTrWx5NrmKdw== + dependencies: + lru-cache "4.1.x" + tmp "0.0.x" + +util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= @@ -10087,7 +12829,7 @@ utils-merge@1.0.1: resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= -uuid@^3.0.1, uuid@^3.2.1, uuid@^3.3.2: +uuid@^3.0.1, uuid@^3.1.0, uuid@^3.2.1, uuid@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== @@ -10119,6 +12861,11 @@ validate-npm-package-name@~2.2.2: dependencies: builtins "0.0.7" +validator@^10.4.0: + version "10.9.0" + resolved "https://registry.yarnpkg.com/validator/-/validator-10.9.0.tgz#d10c11673b5061fb7ccf4c1114412411b2bac2a8" + integrity sha512-hZJcZSWz9poXBlAkjjcsNAdrZ6JbjD3kWlNjq/+vE7RLLS/+8PAj3qVVwrwsOz/WL8jPmZ1hYkRvtlUeZAm4ug== + vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" @@ -10133,6 +12880,23 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" +vise@3.x.x: + version "3.0.2" + resolved "https://registry.yarnpkg.com/vise/-/vise-3.0.2.tgz#9a8b7450f783aa776faa327fe47d7bfddb227266" + integrity sha512-X52VtdRQbSBXdjcazRiY3eRgV3vTQ0B+7Wh8uC9cVv7lKfML5m9+9NHlbcgCY0R9EAqD1v/v7o9mhGh2A3ANFg== + dependencies: + hoek "6.x.x" + +vision@^5.4.3: + version "5.4.3" + resolved "https://registry.yarnpkg.com/vision/-/vision-5.4.3.tgz#648663667f22dc6da17a00c049c2c1a97366d72f" + integrity sha512-4uVrdAKSjNF3WVf1Mjq//SfMclUgpHJtk0EBESyLFcZmrqJjUQ08DyCsRYqw31qEFK3bVm8UO9BlfodRwuyETg== + dependencies: + boom "7.x.x" + hoek "6.x.x" + items "2.x.x" + joi "14.x.x" + vm-browserify@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73" @@ -10317,6 +13081,13 @@ widest-line@^2.0.0: dependencies: string-width "^2.1.1" +wif@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/wif/-/wif-2.0.6.tgz#08d3f52056c66679299726fade0d432ae74b4704" + integrity sha1-CNP1IFbGZnkplyb63g1DKudLRwQ= + dependencies: + bs58check "<3.0.0" + win-release@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/win-release/-/win-release-1.1.1.tgz#5fa55e02be7ca934edfc12665632e849b72e5209" @@ -10329,6 +13100,57 @@ window-size@^0.1.4: resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.4.tgz#f8e1aa1ee5a53ec5bf151ffa09742a6ad7697876" integrity sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY= +winston-compat@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/winston-compat/-/winston-compat-0.1.4.tgz#599b4ce807ffe728713ecc25ede3f6b89425b739" + integrity sha512-mMEfFsSm6GmkFF+f4/0UJtG4N1vSaczGmXLVJYmS/+u2zUaIPcw2ZRuwUg2TvVBjswgiraN+vNnAG8z4fRUZ4w== + dependencies: + cycle "~1.0.3" + logform "^1.6.0" + triple-beam "^1.2.0" + +winston-daily-rotate-file@^3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/winston-daily-rotate-file/-/winston-daily-rotate-file-3.5.1.tgz#38249976dc5326afa7f3a1e4a39a8211f349e2fe" + integrity sha512-Y5CECbcJro55HWcWJSzI1DiQrbrfwwvKHdCCJn9wWsWCGfnCPDl5SWIokS2M0EvOKtbZUrlm5DPG522mvjdUBQ== + dependencies: + file-stream-rotator "^0.4.1" + object-hash "^1.3.0" + semver "^5.6.0" + triple-beam "^1.3.0" + winston-compat "^0.1.4" + winston-transport "^4.2.0" + +winston-transport@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.2.0.tgz#a20be89edf2ea2ca39ba25f3e50344d73e6520e5" + integrity sha512-0R1bvFqxSlK/ZKTH86nymOuKv/cT1PQBMuDdA7k7f0S9fM44dNH6bXnuxwXPrN8lefJgtZq08BKdyZ0DZIy/rg== + dependencies: + readable-stream "^2.3.6" + triple-beam "^1.2.0" + +winston@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/winston/-/winston-3.1.0.tgz#80724376aef164e024f316100d5b178d78ac5331" + integrity sha512-FsQfEE+8YIEeuZEYhHDk5cILo1HOcWkGwvoidLrDgPog0r4bser1lEIOco2dN9zpDJ1M88hfDgZvxe5z4xNcwg== + dependencies: + async "^2.6.0" + diagnostics "^1.1.1" + is-stream "^1.1.0" + logform "^1.9.1" + one-time "0.0.4" + readable-stream "^2.3.6" + stack-trace "0.0.x" + triple-beam "^1.3.0" + winston-transport "^4.2.0" + +wkx@^0.4.1: + version "0.4.6" + resolved "https://registry.yarnpkg.com/wkx/-/wkx-0.4.6.tgz#228ab592e6457382ea6fb79fc825058d07fce523" + integrity sha512-LHxXlzRCYQXA9ZHgs8r7Gafh0gVOE8o3QmudM1PIkOdkXXjW7Thcl+gb2P2dRuKgW8cqkitCRZkkjtmWzpHi7A== + dependencies: + "@types/node" "*" + wordwrap@~0.0.2: version "0.0.3" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" @@ -10367,6 +13189,14 @@ wrappy@1, wrappy@~1.0.2: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= +wreck@14.x.x, wreck@^14.0.2: + version "14.1.3" + resolved "https://registry.yarnpkg.com/wreck/-/wreck-14.1.3.tgz#d4db8258b38a568c363ef7d23034c4db598a9213" + integrity sha512-hb/BUtjX3ObbwO3slCOLCenQ4EP8e+n8j6FmTne3VhEFp5XV1faSJojiyxVSvw34vgdeTG5baLTl4NmjwokLlw== + dependencies: + boom "7.x.x" + hoek "6.x.x" + write-file-atomic@^2.0.0, write-file-atomic@^2.1.0, write-file-atomic@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab" @@ -10412,6 +13242,18 @@ ws@^5.2.0: dependencies: async-limiter "~1.0.0" +ws@^6.0.0: + version "6.1.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-6.1.2.tgz#3cc7462e98792f0ac679424148903ded3b9c3ad8" + integrity sha512-rfUqzvz0WxmSXtJpPMX2EeASXabOrSMk1ruMOV3JBTBjo4ac2lDjGGsbQSyxj8Odhw5fBib8ZKEjDNvgouNKYw== + dependencies: + async-limiter "~1.0.0" + +xcase@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/xcase/-/xcase-2.0.1.tgz#c7fa72caa0f440db78fd5673432038ac984450b9" + integrity sha1-x/pyyqD0QNt4/VZzQyA4rJhEULk= + xdg-basedir@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" @@ -10440,6 +13282,11 @@ xregexp@2.0.0: resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-2.0.0.tgz#52a63e56ca0b84a7f3a5f3d61872f126ad7a5943" integrity sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM= +xstate@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/xstate/-/xstate-4.2.1.tgz#d3a8aa304a22117a741b94401b8632cd75ec902f" + integrity sha512-dQEHU/78tUWQd43EMm+17xdM9xVqivSYvNh2++5CY0yST8FcBSl0cyfwrL6tF2MZBqpbuuNLWYc+Ib1bG/jlxQ== + xtend@^4.0.0, xtend@~4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" @@ -10465,7 +13312,7 @@ yallist@^3.0.0, yallist@^3.0.2: resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A== -yargs-parser@10.x: +yargs-parser@10.x, yargs-parser@^10.0.0: version "10.1.0" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8" integrity sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ== @@ -10535,3 +13382,15 @@ yargs@^3.19.0: string-width "^1.0.1" window-size "^0.1.4" y18n "^3.2.0" + +zen-observable-ts@^0.8.13: + version "0.8.13" + resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-0.8.13.tgz#ae1fd77c84ef95510188b1f8bca579d7a5448fc2" + integrity sha512-WDb8SM0tHCb6c0l1k60qXWlm1ok3zN9U4VkLdnBKQwIYwUoB9psH7LIFgR+JVCCMmBxUgOjskIid8/N02k/2Bg== + dependencies: + zen-observable "^0.8.0" + +zen-observable@^0.8.0: + version "0.8.11" + resolved "https://registry.yarnpkg.com/zen-observable/-/zen-observable-0.8.11.tgz#d3415885eeeb42ee5abb9821c95bb518fcd6d199" + integrity sha512-N3xXQVr4L61rZvGMpWe8XoCGX8vhU35dPyQ4fm5CY/KDlG0F75un14hjbckPXTDuKUY6V0dqR2giT6xN8Y4GEQ== From 41195e3d7e422be90e526c186adeda568862c2ca Mon Sep 17 00:00:00 2001 From: Brian Faust Date: Sat, 15 Dec 2018 08:49:58 +0200 Subject: [PATCH 11/63] fix(core-transaction-pool): get dynamic fee config from the crypto config --- packages/core-transaction-pool/__tests__/dynamic-fee.test.ts | 5 +++-- packages/core-transaction-pool/__tests__/guard.test.ts | 4 ++-- .../core-transaction-pool/src/utils/dynamicfee-matcher.ts | 5 ++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/core-transaction-pool/__tests__/dynamic-fee.test.ts b/packages/core-transaction-pool/__tests__/dynamic-fee.test.ts index 316094b165..ef5e874dcb 100644 --- a/packages/core-transaction-pool/__tests__/dynamic-fee.test.ts +++ b/packages/core-transaction-pool/__tests__/dynamic-fee.test.ts @@ -1,3 +1,4 @@ +import { configManager } from "@arkecosystem/crypto"; import { dynamicFeeMatcher } from "../src/utils/dynamicfee-matcher"; import { transactions } from "./__fixtures__/transactions"; import { setUpFull, tearDown } from "./__support__/setup"; @@ -22,7 +23,7 @@ describe("static fees", () => { }, })); const h = blockchain.getLastBlock().data.height; - container.resolvePlugin("config").getConstants(h).fees.dynamic = false; + configManager.set("dynamicFees.enabled", false); }); it("should accept transactions matching the static fee for broadcast", () => { @@ -55,7 +56,7 @@ describe("dynamic fees", () => { }, })); const h = blockchain.getLastBlock().data.height; - container.resolvePlugin("config").getConstants(h).fees.dynamic = true; + configManager.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..a7f2471644 100644 --- a/packages/core-transaction-pool/__tests__/guard.test.ts +++ b/packages/core-transaction-pool/__tests__/guard.test.ts @@ -44,8 +44,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/utils/dynamicfee-matcher.ts b/packages/core-transaction-pool/src/utils/dynamicfee-matcher.ts index 475cdcb398..b92679a73a 100644 --- a/packages/core-transaction-pool/src/utils/dynamicfee-matcher.ts +++ b/packages/core-transaction-pool/src/utils/dynamicfee-matcher.ts @@ -1,5 +1,5 @@ import { app } from "@arkecosystem/core-container"; -import { dynamicFeeManager, feeManager, formatArktoshi } from "@arkecosystem/crypto"; +import { configManager, dynamicFeeManager, feeManager, formatArktoshi } from "@arkecosystem/crypto"; /** * Determine if a transaction's fee meets the minimum requirements for broadcasting @@ -8,14 +8,13 @@ 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 dynamicFees = config.get("dynamicFees"); + const dynamicFees = configManager.get("dynamicFees"); let broadcast; let enterPool; From b8e2b3eb26d9f543e9863a9504982db2269785fa Mon Sep 17 00:00:00 2001 From: Brian Faust Date: Sat, 15 Dec 2018 08:50:45 +0200 Subject: [PATCH 12/63] refactor(crypto): use lodash get/set for the config to allow nested values --- packages/crypto/package.json | 2 ++ packages/crypto/src/managers/config.ts | 6 ++++-- packages/crypto/src/managers/dynamic-fee.ts | 4 ++-- packages/crypto/src/managers/fee.ts | 3 +-- 4 files changed, 9 insertions(+), 6 deletions(-) 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/managers/config.ts b/packages/crypto/src/managers/config.ts index d3f451d03e..535e99ce4d 100644 --- a/packages/crypto/src/managers/config.ts +++ b/packages/crypto/src/managers/config.ts @@ -1,5 +1,7 @@ import deepmerge from "deepmerge"; import camelCase from "lodash/camelCase"; +import get from "lodash/get"; +import set from "lodash/set"; import { dynamicFeeManager } from "./dynamic-fee"; import { feeManager } from "./fee"; @@ -62,7 +64,7 @@ export class ConfigManager { * @param {*} value */ public set(key, value) { - this.config[key] = value; + set(this.config, key, value); } /** @@ -71,7 +73,7 @@ export class ConfigManager { * @return {*} */ public get(key) { - return this.config[key]; + return get(this.config, key); } /** diff --git a/packages/crypto/src/managers/dynamic-fee.ts b/packages/crypto/src/managers/dynamic-fee.ts index 4ce459961a..a276268a75 100644 --- a/packages/crypto/src/managers/dynamic-fee.ts +++ b/packages/crypto/src/managers/dynamic-fee.ts @@ -2,6 +2,7 @@ import { TRANSACTION_TYPES } from "../constants"; class DynamicFeeManager { public offsets: {}; + /** * @constructor */ @@ -58,5 +59,4 @@ class DynamicFeeManager { } } -const dynamicFeeManager = new DynamicFeeManager(); -export { dynamicFeeManager }; +export const dynamicFeeManager = new DynamicFeeManager(); diff --git a/packages/crypto/src/managers/fee.ts b/packages/crypto/src/managers/fee.ts index 1fd379da03..66912feb69 100644 --- a/packages/crypto/src/managers/fee.ts +++ b/packages/crypto/src/managers/fee.ts @@ -54,5 +54,4 @@ export class FeeManager { } } -const feeManager = new FeeManager(); -export { feeManager }; +export const feeManager = new FeeManager(); From 77636c0c6c33325309503ae7b7e24a234b802d89 Mon Sep 17 00:00:00 2001 From: Brian Faust Date: Sat, 15 Dec 2018 09:04:42 +0200 Subject: [PATCH 13/63] refactor(core-utils): get network from crypto config --- packages/core-utils/src/supply-calculator.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/core-utils/src/supply-calculator.ts b/packages/core-utils/src/supply-calculator.ts index e79bf7f320..9cf66d3c63 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 @@ -8,7 +8,7 @@ import { Bignum } from "@arkecosystem/crypto"; */ function calculate(height) { const config = app.resolvePlugin("config"); - const network = config.network; + const network = configManager.all(); if (!height) { const blockchain = app.resolvePlugin("blockchain"); From 90676f9d910ffe711a3113c0984f00b227db9bdd Mon Sep 17 00:00:00 2001 From: Brian Faust Date: Sat, 15 Dec 2018 09:05:50 +0200 Subject: [PATCH 14/63] fix(core-json-rpc): do not overwrite the core-config values --- packages/core-json-rpc/src/server/services/network.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/core-json-rpc/src/server/services/network.ts b/packages/core-json-rpc/src/server/services/network.ts index d9acae8af1..aec2b938f5 100644 --- a/packages/core-json-rpc/src/server/services/network.ts +++ b/packages/core-json-rpc/src/server/services/network.ts @@ -18,12 +18,10 @@ class Network { this.config = app.resolvePlugin("config"); this.p2p = app.resolvePlugin("p2p"); - this.network = this.config.network; + this.network = configManager.get("name"); this.__loadRemotePeers(); - configManager.setConfig(this.config.network); - this.client = axios.create({ headers: { Accept: "application/vnd.ark.core-api.v2+json", From e24bb05d6560324269cb1a3361d9245b0e05996e Mon Sep 17 00:00:00 2001 From: Brian Faust Date: Sat, 15 Dec 2018 09:06:17 +0200 Subject: [PATCH 15/63] fix(core-container): use the name of the network object --- packages/core-container/src/environment.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core-container/src/environment.ts b/packages/core-container/src/environment.ts index bcf623ea9d..000b148815 100644 --- a/packages/core-container/src/environment.ts +++ b/packages/core-container/src/environment.ts @@ -65,7 +65,7 @@ export class Environment { } process.env.ARK_NETWORK = JSON.stringify(config); - process.env.ARK_NETWORK_NAME = config.name; + process.env.ARK_NETWORK_NAME = config.network.name; } /** From 829185a209902bfc59922e35a624194e7f728b6e Mon Sep 17 00:00:00 2001 From: Brian Faust Date: Sat, 15 Dec 2018 10:28:09 +0200 Subject: [PATCH 16/63] refactor(core-config): expose the crypto config was network --- packages/core-config/src/loader.ts | 2 +- packages/core-utils/src/supply-calculator.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/core-config/src/loader.ts b/packages/core-config/src/loader.ts index f4cfdaf15a..065c07bdc4 100644 --- a/packages/core-config/src/loader.ts +++ b/packages/core-config/src/loader.ts @@ -30,7 +30,7 @@ export class Loader { configManager.setConfig(this.network); // TODO: change once the config object has been implemented - this.network = this.network.network; + this.network = configManager.all(); } public get(key: string, defaultValue: any = null): any { diff --git a/packages/core-utils/src/supply-calculator.ts b/packages/core-utils/src/supply-calculator.ts index 9cf66d3c63..74a0f26812 100644 --- a/packages/core-utils/src/supply-calculator.ts +++ b/packages/core-utils/src/supply-calculator.ts @@ -8,7 +8,7 @@ import { Bignum, configManager } from "@arkecosystem/crypto"; */ function calculate(height) { const config = app.resolvePlugin("config"); - const network = configManager.all(); + const network = config.network; if (!height) { const blockchain = app.resolvePlugin("blockchain"); From 89be107b0f1896532fd5ffe509b83eedc1f455c0 Mon Sep 17 00:00:00 2001 From: Brian Faust Date: Sat, 15 Dec 2018 10:32:22 +0200 Subject: [PATCH 17/63] test: skip a few config tests for the moment --- packages/core-config/__tests__/loader.test.ts | 2 +- packages/core-deployer/__tests__/builder/genesis-block.test.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/core-config/__tests__/loader.test.ts b/packages/core-config/__tests__/loader.test.ts index 7a340bc15f..dca2ead2f5 100644 --- a/packages/core-config/__tests__/loader.test.ts +++ b/packages/core-config/__tests__/loader.test.ts @@ -29,7 +29,7 @@ describe("Config Loader", () => { } }); - it("should succeed with a config", async () => { + it.skip("should succeed with a config", async () => { const result = await loader.setUp(stubConfig); stubConfig.network.milestones[1] = { ...stubConfig.network.milestones[0] }; diff --git a/packages/core-deployer/__tests__/builder/genesis-block.test.ts b/packages/core-deployer/__tests__/builder/genesis-block.test.ts index 911c532d66..d4a6fd4b17 100644 --- a/packages/core-deployer/__tests__/builder/genesis-block.test.ts +++ b/packages/core-deployer/__tests__/builder/genesis-block.test.ts @@ -17,7 +17,7 @@ beforeEach(() => { delegateWallets = builder.__buildDelegates(); }); -describe("Genesis Block Builder", () => { +describe.skip("Genesis Block Builder", () => { describe("generate", () => { it("should return a genesis object", () => { genesis = builder.generate(); From 3896b339772ddd7e4a406eb1da8d89042c147809 Mon Sep 17 00:00:00 2001 From: Brian Faust Date: Sat, 15 Dec 2018 10:34:42 +0200 Subject: [PATCH 18/63] test(core-deployer): re-enable tests --- .../core-deployer/__tests__/builder/genesis-block.test.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/core-deployer/__tests__/builder/genesis-block.test.ts b/packages/core-deployer/__tests__/builder/genesis-block.test.ts index d4a6fd4b17..8587f24cf2 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/ark"; 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, }); @@ -17,7 +17,7 @@ beforeEach(() => { delegateWallets = builder.__buildDelegates(); }); -describe.skip("Genesis Block Builder", () => { +describe("Genesis Block Builder", () => { describe("generate", () => { it("should return a genesis object", () => { genesis = builder.generate(); From bb9ade93bac8df7c8350d2182231513533d94455 Mon Sep 17 00:00:00 2001 From: Brian Faust Date: Sat, 15 Dec 2018 10:39:27 +0200 Subject: [PATCH 19/63] test(core-config): re-enable tests --- packages/core-config/__tests__/loader.test.ts | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/packages/core-config/__tests__/loader.test.ts b/packages/core-config/__tests__/loader.test.ts index dca2ead2f5..56cd049a78 100644 --- a/packages/core-config/__tests__/loader.test.ts +++ b/packages/core-config/__tests__/loader.test.ts @@ -1,3 +1,5 @@ +import "jest-extended"; + import { resolve } from "path"; import { Loader } from "../src/loader"; @@ -29,15 +31,14 @@ describe("Config Loader", () => { } }); - it.skip("should succeed with a config", async () => { + it("should succeed with a config", async () => { const result = await loader.setUp(stubConfig); - stubConfig.network.milestones[1] = { ...stubConfig.network.milestones[0] }; - stubConfig.network.milestones[1].height = 75600; - stubConfig.network.milestones[1].reward = 200000000; - expect(loader.delegates).toEqual(stubConfig.delegates); expect(loader.genesisBlock).toEqual(stubConfig.genesisBlock); - expect(loader.network).toEqual(stubConfig.network.network); + expect(loader.network).toContainAllKeys([ + ...Object.keys(stubConfig.network.network), + ...["constants", "dynamicFees"], + ]); }); }); From a4d6d828e68966723a3149f323c4ecc2f72da026 Mon Sep 17 00:00:00 2001 From: Brian Faust Date: Sat, 15 Dec 2018 10:47:08 +0200 Subject: [PATCH 20/63] test(core): re-enable tests --- packages/core-container/src/container.ts | 8 +++++++- packages/core/__tests__/__support__/app.ts | 1 + packages/core/__tests__/commands/start-forger.test.ts | 2 +- .../__tests__/commands/start-relay-and-forger.test.ts | 2 +- packages/core/__tests__/commands/start-relay.test.ts | 2 +- packages/core/src/commands/index.ts | 3 +++ 6 files changed, 14 insertions(+), 4 deletions(-) diff --git a/packages/core-container/src/container.ts b/packages/core-container/src/container.ts index 1a44bd1661..d488920d0f 100644 --- a/packages/core-container/src/container.ts +++ b/packages/core-container/src/container.ts @@ -7,6 +7,7 @@ import { RemoteLoader } from "./remote-loader"; export class Container { public container: any; + public options: any; public exitEvents: any; public silentShutdown: boolean; public hashid: string; @@ -52,6 +53,8 @@ export class Container { * @return {void} */ public async setUp(version, variables, options: any = {}) { + this.options = options; + this.__registerExitHandler(); this.setVersion(version); @@ -65,6 +68,7 @@ export class Container { this.env.setUp(); if (options.skipPlugins) { + this.isReady = true; return; } @@ -80,7 +84,9 @@ export class Container { * @return {Promise} */ public async tearDown() { - await this.plugins.tearDown(); + if (!this.options.skipPlugins) { + await this.plugins.tearDown(); + } this.isReady = false; } 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__/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/src/commands/index.ts b/packages/core/src/commands/index.ts index 3eda171589..2f82e716ef 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; @@ -31,6 +32,7 @@ export async function startForger(options, version) { password: options.password || process.env.ARK_FORGER_PASSWORD, }, }, + skipPlugins: options.skipPlugins, }); return app; @@ -49,6 +51,7 @@ export async function startRelayAndForger(options, version) { password: options.password || process.env.ARK_FORGER_PASSWORD, }, }, + skipPlugins: options.skipPlugins, }); return app; From 25123fc5f9b4363a23cc16af5638ad54e27a726b Mon Sep 17 00:00:00 2001 From: Brian Faust Date: Sat, 15 Dec 2018 13:47:06 +0200 Subject: [PATCH 21/63] refactor(crypto): rename getConstants to getMilestone --- .../core-api/src/versions/1/accounts/controller.ts | 2 +- .../core-api/src/versions/1/blocks/controller.ts | 12 ++++++------ .../core-api/src/versions/1/delegates/controller.ts | 4 ++-- packages/core-api/src/versions/1/delegates/schema.ts | 2 +- .../core-api/src/versions/1/signatures/controller.ts | 2 +- packages/core-api/src/versions/2/node/controller.ts | 2 +- .../src/versions/2/transactions/controller.ts | 2 +- packages/core-blockchain/src/blockchain.ts | 8 ++++---- packages/core-blockchain/src/state-machine.ts | 2 +- packages/core-config/src/loader.ts | 4 ++-- packages/core-database-postgres/src/connection.ts | 2 +- packages/core-database-postgres/src/spv.ts | 2 +- packages/core-database/src/interface.ts | 4 ++-- packages/core-forger/src/manager.ts | 2 +- packages/core-p2p/src/server/versions/1/handlers.ts | 2 +- .../src/server/versions/internal/handlers/rounds.ts | 6 +++--- .../versions/internal/handlers/transactions.ts | 2 +- packages/core-snapshots/src/db/index.ts | 2 +- packages/core-snapshots/src/manager.ts | 2 +- .../__support__/mocks/core-container-calculator.ts | 2 +- .../__tests__/__support__/mocks/core-container.ts | 2 +- packages/core-utils/src/delegate-calculator.ts | 2 +- packages/core-utils/src/format-timestamp.ts | 2 +- packages/core-utils/src/round-calculator.ts | 4 ++-- packages/core-vote-report/src/handler.ts | 2 +- packages/crypto/__tests__/managers/config.test.ts | 2 +- packages/crypto/src/crypto/slots.ts | 2 +- packages/crypto/src/managers/config.ts | 4 ++-- packages/crypto/src/models/block.ts | 2 +- 29 files changed, 44 insertions(+), 44 deletions(-) diff --git a/packages/core-api/src/versions/1/accounts/controller.ts b/packages/core-api/src/versions/1/accounts/controller.ts index 80b8ba1da3..65f00f6bef 100644 --- a/packages/core-api/src/versions/1/accounts/controller.ts +++ b/packages/core-api/src/versions/1/accounts/controller.ts @@ -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..a7e5279b79 100644 --- a/packages/core-api/src/versions/1/blocks/controller.ts +++ b/packages/core-api/src/versions/1/blocks/controller.ts @@ -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); @@ -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,7 +116,7 @@ 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({ @@ -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({ diff --git a/packages/core-api/src/versions/1/delegates/controller.ts b/packages/core-api/src/versions/1/delegates/controller.ts index 3e01aec517..aaa7dbe8b9 100644 --- a/packages/core-api/src/versions/1/delegates/controller.ts +++ b/packages/core-api/src/versions/1/delegates/controller.ts @@ -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..24443082f0 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.resolvePlugin("config").getMilestone(lastBlock.data.height).activeDelegates : 51, }, offset: { type: "integer", diff --git a/packages/core-api/src/versions/1/signatures/controller.ts b/packages/core-api/src/versions/1/signatures/controller.ts index 1c9df35696..576d6cedb4 100644 --- a/packages/core-api/src/versions/1/signatures/controller.ts +++ b/packages/core-api/src/versions/1/signatures/controller.ts @@ -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/2/node/controller.ts b/packages/core-api/src/versions/2/node/controller.ts index 5a11280ba3..4b4b2126ae 100644 --- a/packages/core-api/src/versions/2/node/controller.ts +++ b/packages/core-api/src/versions/2/node/controller.ts @@ -62,7 +62,7 @@ export class NodeController extends Controller { explorer: this.config.network.client.explorer, version: this.config.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/transactions/controller.ts b/packages/core-api/src/versions/2/transactions/controller.ts index 1fdfb8016b..d5f634a34c 100644 --- a/packages/core-api/src/versions/2/transactions/controller.ts +++ b/packages/core-api/src/versions/2/transactions/controller.ts @@ -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-blockchain/src/blockchain.ts b/packages/core-blockchain/src/blockchain.ts index b9f82ddee8..bc132a5cbe 100644 --- a/packages/core-blockchain/src/blockchain.ts +++ b/packages/core-blockchain/src/blockchain.ts @@ -185,7 +185,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) { @@ -390,7 +390,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); } @@ -504,7 +504,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; } /** @@ -524,7 +524,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 9938942155..bae0c78cc4 100644 --- a/packages/core-blockchain/src/state-machine.ts +++ b/packages/core-blockchain/src/state-machine.ts @@ -201,7 +201,7 @@ blockchainMachine.actionMap = 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; diff --git a/packages/core-config/src/loader.ts b/packages/core-config/src/loader.ts index 065c07bdc4..45d153e6ad 100644 --- a/packages/core-config/src/loader.ts +++ b/packages/core-config/src/loader.ts @@ -48,8 +48,8 @@ export class Loader { * @param {Number} height * @return {void} */ - public getConstants(height: number): void { - return configManager.getConstants(height); + public getMilestone(height: number): void { + return configManager.getMilestone(height); } /** diff --git a/packages/core-database-postgres/src/connection.ts b/packages/core-database-postgres/src/connection.ts index c0d1f22c79..3fad0d3d65 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..50bd4a8a0d 100644 --- a/packages/core-database-postgres/src/spv.ts +++ b/packages/core-database-postgres/src/spv.ts @@ -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/src/interface.ts b/packages/core-database/src/interface.ts index 11f21679cf..25802b2797 100644 --- a/packages/core-database/src/interface.ts +++ b/packages/core-database/src/interface.ts @@ -267,7 +267,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; @@ -483,7 +483,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); diff --git a/packages/core-forger/src/manager.ts b/packages/core-forger/src/manager.ts index d320778739..1a03a31b00 100644 --- a/packages/core-forger/src/manager.ts +++ b/packages/core-forger/src/manager.ts @@ -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-p2p/src/server/versions/1/handlers.ts b/packages/core-p2p/src/server/versions/1/handlers.ts index f7187b7a76..d83297f26a 100644 --- a/packages/core-p2p/src/server/versions/1/handlers.ts +++ b/packages/core-p2p/src/server/versions/1/handlers.ts @@ -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/internal/handlers/rounds.ts b/packages/core-p2p/src/server/versions/internal/handlers/rounds.ts index ec5d0ba65a..983cd8f6f8 100644 --- a/packages/core-p2p/src/server/versions/internal/handlers/rounds.ts +++ b/packages/core-p2p/src/server/versions/internal/handlers/rounds.ts @@ -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..321860027b 100644 --- a/packages/core-p2p/src/server/versions/internal/handlers/transactions.ts +++ b/packages/core-p2p/src/server/versions/internal/handlers/transactions.ts @@ -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-snapshots/src/db/index.ts b/packages/core-snapshots/src/db/index.ts index 29eea50e61..4e48a1a9dc 100644 --- a/packages/core-snapshots/src/db/index.ts +++ b/packages/core-snapshots/src/db/index.ts @@ -68,7 +68,7 @@ class Database { public async rollbackChain(height) { const config = app.resolvePlugin("config"); - const maxDelegates = config.getConstants(height).activeDelegates; + 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..ec432d26af 100644 --- a/packages/core-snapshots/src/manager.ts +++ b/packages/core-snapshots/src/manager.ts @@ -80,7 +80,7 @@ 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 maxDelegates = config.getMilestone(lastBlock.height).activeDelegates; const rollBackHeight = height === -1 ? lastBlock.height : height; if (rollBackHeight >= lastBlock.height || rollBackHeight < 1) { 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 d24ea09acd..1ddf608b0b 100644 --- a/packages/core-utils/__tests__/__support__/mocks/core-container-calculator.ts +++ b/packages/core-utils/__tests__/__support__/mocks/core-container-calculator.ts @@ -4,7 +4,7 @@ jest.mock("@arkecosystem/core-container", () => { 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..fd0c6cdab9 100644 --- a/packages/core-utils/__tests__/__support__/mocks/core-container.ts +++ b/packages/core-utils/__tests__/__support__/mocks/core-container.ts @@ -4,7 +4,7 @@ jest.mock("@arkecosystem/core-container", () => { resolvePlugin: name => { if (name === "config") { return { - getConstants: () => ({ + getMilestone: () => ({ epoch: "2017-03-21T13:00:00.000Z", activeDelegates: 51, }), diff --git a/packages/core-utils/src/delegate-calculator.ts b/packages/core-utils/src/delegate-calculator.ts index 81a4cdf1ff..9ea8ec86d4 100644 --- a/packages/core-utils/src/delegate-calculator.ts +++ b/packages/core-utils/src/delegate-calculator.ts @@ -16,7 +16,7 @@ function calculateApproval(delegate, height: any = null) { height = app.resolvePlugin("blockchain").getLastBlock().data.height; } - const constants = config.getConstants(height); + const constants = config.getMilestone(height); const totalSupply = new BignumMod(config.genesisBlock.totalAmount).plus( (height - constants.height) * constants.reward, ); diff --git a/packages/core-utils/src/format-timestamp.ts b/packages/core-utils/src/format-timestamp.ts index 061e15076b..5cb75121ec 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.resolvePlugin("config").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..c25871f41d 100644 --- a/packages/core-utils/src/round-calculator.ts +++ b/packages/core-utils/src/round-calculator.ts @@ -8,7 +8,7 @@ import { app } from "@arkecosystem/core-container"; */ function calculateRound(height, maxDelegates: any = null) { const config = app.resolvePlugin("config"); - maxDelegates = maxDelegates || config.getConstants(height).activeDelegates; + maxDelegates = maxDelegates || config.getMilestone(height).activeDelegates; const round = Math.floor((height - 1) / maxDelegates) + 1; const nextRound = Math.floor(height / maxDelegates) + 1; @@ -23,7 +23,7 @@ function calculateRound(height, maxDelegates: any = null) { */ function isNewRound(height) { const config = app.resolvePlugin("config"); - const maxDelegates = config.getConstants(height).activeDelegates; + const maxDelegates = config.getMilestone(height).activeDelegates; return height % maxDelegates === 1; } diff --git a/packages/core-vote-report/src/handler.ts b/packages/core-vote-report/src/handler.ts index dfb4d63e5d..639be6e471 100644 --- a/packages/core-vote-report/src/handler.ts +++ b/packages/core-vote-report/src/handler.ts @@ -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/crypto/__tests__/managers/config.test.ts b/packages/crypto/__tests__/managers/config.test.ts index dbbb74b128..9998ae4253 100644 --- a/packages/crypto/__tests__/managers/config.test.ts +++ b/packages/crypto/__tests__/managers/config.test.ts @@ -65,7 +65,7 @@ describe("Configuration", () => { }); it("should get constants for height", () => { - expect(configManager.getConstants(21600)).toEqual(devnet.milestones[2]); + expect(configManager.getMilestone(21600)).toEqual(devnet.milestones[2]); }); it("should set the height", () => { diff --git a/packages/crypto/src/crypto/slots.ts b/packages/crypto/src/crypto/slots.ts index 8d670c1286..6e81bba1de 100644 --- a/packages/crypto/src/crypto/slots.ts +++ b/packages/crypto/src/crypto/slots.ts @@ -127,7 +127,7 @@ class Slots { * @return {*} */ public getConstant(key) { - return configManager.getConstants(this.height)[key]; + return configManager.getMilestone(this.height)[key]; } /** diff --git a/packages/crypto/src/managers/config.ts b/packages/crypto/src/managers/config.ts index 535e99ce4d..2715ae27eb 100644 --- a/packages/crypto/src/managers/config.ts +++ b/packages/crypto/src/managers/config.ts @@ -98,7 +98,7 @@ export class ConfigManager { * @return {*} */ public getConstant(key) { - return this.getConstants()[key]; + return this.getMilestone()[key]; } /** @@ -106,7 +106,7 @@ export class ConfigManager { * @param {(Number|undefined)} height * @return {*} */ - public getConstants(height?) { + public getMilestone(height?) { if (!height && this.height) { height = this.height; } diff --git a/packages/crypto/src/models/block.ts b/packages/crypto/src/models/block.ts index 5b8a2eee2a..f04f1fb2a6 100644 --- a/packages/crypto/src/models/block.ts +++ b/packages/crypto/src/models/block.ts @@ -431,7 +431,7 @@ export class Block { }; try { - const constants = configManager.getConstants(block.height); + const constants = configManager.getMilestone(block.height); // let previousBlock = null From c097709fd4aabd3814be7e66fb8cde241bc9c5a5 Mon Sep 17 00:00:00 2001 From: Brian Faust Date: Sat, 15 Dec 2018 14:35:55 +0200 Subject: [PATCH 22/63] refactor(core-config): validate the full config with Joi --- packages/core-config/package.json | 2 + packages/core-config/src/loader.ts | 32 ++++------- packages/core-config/src/schema.ts | 86 ++++++++++++++++++++++++++++++ yarn.lock | 2 +- 4 files changed, 99 insertions(+), 23 deletions(-) create mode 100644 packages/core-config/src/schema.ts diff --git a/packages/core-config/package.json b/packages/core-config/package.json index b1d3f548f8..5c52d5c89a 100644 --- a/packages/core-config/package.json +++ b/packages/core-config/package.json @@ -29,10 +29,12 @@ "dependencies": { "@arkecosystem/crypto": "^2.1.0", "@types/fs-extra": "^5.0.4", + "@types/joi": "^14.0.1", "@types/lodash.get": "^4.4.4", "@types/lodash.set": "^4.3.4", "axios": "^0.18.0", "fs-extra": "^7.0.1", + "joi": "^14.3.0", "lodash.get": "^4.4.2", "lodash.set": "^4.3.2" }, diff --git a/packages/core-config/src/loader.ts b/packages/core-config/src/loader.ts index 45d153e6ad..ea6619a6de 100644 --- a/packages/core-config/src/loader.ts +++ b/packages/core-config/src/loader.ts @@ -1,10 +1,11 @@ import { configManager } from "@arkecosystem/crypto"; -import { strictEqual } from "assert"; 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 { schema } from "./schema"; export class Loader { public network: any; @@ -21,13 +22,17 @@ export class Loader { */ public async setUp(options: object = {}): Promise { this.options = options; - this.network = JSON.parse(process.env.ARK_NETWORK); - await this.__createFromDirectory(); + const { value, error } = Joi.validate(JSON.parse(process.env.ARK_NETWORK), schema); + + if (error) { + console.error(error.message); + process.exit(1); + } - this._validateConfig(); + await this.__createFromDirectory(); - configManager.setConfig(this.network); + configManager.setConfig(value); // TODO: change once the config object has been implemented this.network = configManager.all(); @@ -131,21 +136,4 @@ export class Loader { } } } - - /** - * Validate crucial parts of the configuration. - * @return {void} - */ - public _validateConfig(): void { - try { - const network = this.network.network; - - strictEqual(Number.isInteger(network.pubKeyHash), true); - strictEqual(network.nethash.length, 64); - strictEqual(Number.isInteger(network.wif), true); - } catch (error) { - throw Error(error.message); - process.exit(1); - } - } } diff --git a/packages/core-config/src/schema.ts b/packages/core-config/src/schema.ts new file mode 100644 index 0000000000..db80d712e7 --- /dev/null +++ b/packages/core-config/src/schema.ts @@ -0,0 +1,86 @@ +import Joi from "joi"; + +export const schema = Joi.object({ + delegates: Joi.object({ + secrets: Joi.array().items(Joi.string()), + bip38: Joi.string(), + }), + dynamicFees: Joi.object({ + enabled: Joi.boolean().required(), + minFeePool: Joi.number() + .integer() + .positive() + .required(), + minFeeBroadcast: Joi.number() + .integer() + .positive() + .required(), + addonBytes: Joi.object() + .keys({ + transfer: Joi.number() + .integer() + .required(), + secondSignature: Joi.number() + .integer() + .required(), + delegateRegistration: Joi.number() + .integer() + .required(), + vote: Joi.number() + .integer() + .required(), + multiSignature: Joi.number() + .integer() + .required(), + ipfs: Joi.number() + .integer() + .required(), + timelockTransfer: Joi.number() + .integer() + .required(), + multiPayment: Joi.number() + .integer() + .required(), + delegateResignation: Joi.number() + .integer() + .required(), + }) + .required(), + }).required(), + milestones: Joi.array() + .items(Joi.object()) + .required(), + 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(), + }), + exceptions: Joi.object({ + blocks: Joi.array().items(Joi.string()), + transactions: Joi.array().items(Joi.string()), + }).required(), + outlookTable: Joi.object(), + transactionIdFixTable: Joi.object(), + }).required(), +}); diff --git a/yarn.lock b/yarn.lock index d38c721c82..d7a3fce50e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1509,7 +1509,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== From 285aa9f5cce7ee4f93dc87a49ee6545fd3f79896 Mon Sep 17 00:00:00 2001 From: Brian Faust Date: Sat, 15 Dec 2018 14:45:29 +0200 Subject: [PATCH 23/63] feat(crypto): add getFromPreset method --- packages/crypto/src/managers/config.ts | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/packages/crypto/src/managers/config.ts b/packages/crypto/src/managers/config.ts index 2715ae27eb..002e98bb72 100644 --- a/packages/crypto/src/managers/config.ts +++ b/packages/crypto/src/managers/config.ts @@ -42,7 +42,7 @@ export class ConfigManager { } /** - * Get config from preset configurations. + * Set the configuration based on a preset. * @param {String} coin * @param {String} network */ @@ -50,6 +50,16 @@ export class ConfigManager { this.setConfig(CONFIGURATIONS[coin.toUpperCase()][network.toUpperCase()]); } + /** + * Get the configuration for a preset. + * @param {String} coin + * @param {String} network + * @return {Object} + */ + public getFromPreset(coin, network) { + return CONFIGURATIONS[coin.toUpperCase()][network.toUpperCase()]; + } + /** * Get all config data. * @return {Object} @@ -134,7 +144,7 @@ export class ConfigManager { /** * Build constant data based on active heights. */ - public buildConstants() { + private buildConstants() { this.constants = this.config.constants.sort((a, b) => a.height - b.height); this.constant = { index: 0, @@ -152,7 +162,7 @@ export class ConfigManager { /** * Build fees from config constants. */ - public buildFees() { + private buildFees() { Object.keys(TRANSACTION_TYPES).forEach(type => feeManager.set(TRANSACTION_TYPES[type], this.getConstant("fees").staticFees[camelCase(type)]), ); @@ -161,7 +171,7 @@ export class ConfigManager { /** * Build addon bytes from config constants. */ - public buildAddonBytes() { + private buildAddonBytes() { const dynamicFees = this.config.dynamicFees; if (dynamicFees.addonBytes) { From 101c542123c3fb2aa89470b7db34d846c1c357ab Mon Sep 17 00:00:00 2001 From: Brian Faust Date: Sat, 15 Dec 2018 15:49:31 +0200 Subject: [PATCH 24/63] refactor: expose milestones and dynamic fee config --- packages/core-config/src/loader.ts | 4 ++++ .../__tests__/supply-calculator.test.ts | 24 +++++++++---------- packages/core-utils/src/supply-calculator.ts | 13 +++++----- .../crypto/__tests__/managers/config.test.ts | 6 ++--- packages/crypto/src/managers/config.ts | 18 +++++++------- 5 files changed, 34 insertions(+), 31 deletions(-) diff --git a/packages/core-config/src/loader.ts b/packages/core-config/src/loader.ts index ea6619a6de..5a79c5b256 100644 --- a/packages/core-config/src/loader.ts +++ b/packages/core-config/src/loader.ts @@ -12,6 +12,8 @@ export class Loader { public peers: any; public delegates: any; public genesisBlock: any; + public milestones: any; + public dynamicFees: any; private options: any; @@ -36,6 +38,8 @@ export class Loader { // TODO: change once the config object has been implemented this.network = configManager.all(); + this.milestones = configManager.get("milestones"); + this.dynamicFees = configManager.get("dynamicFees"); } public get(key: string, defaultValue: any = null): any { diff --git a/packages/core-utils/__tests__/supply-calculator.test.ts b/packages/core-utils/__tests__/supply-calculator.test.ts index 6445cdad81..f3b1ca9d8c 100644 --- a/packages/core-utils/__tests__/supply-calculator.test.ts +++ b/packages/core-utils/__tests__/supply-calculator.test.ts @@ -6,7 +6,7 @@ let config; const mockConfig = { genesisBlock: { totalAmount: 1000 }, - network: { constants: [{ height: 1, reward: 2 }] }, + milestones: [{ height: 1, reward: 2 }], }; app.resolvePlugin = jest.fn(plugin => { @@ -14,7 +14,6 @@ app.resolvePlugin = jest.fn(plugin => { return mockConfig; } - // FIX: check if that mock is correct if (plugin === "blockchain") { return { getLastBlock: () => { @@ -34,24 +33,23 @@ beforeAll(() => { config = app.resolvePlugin("config"); }); -// 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 +62,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 +96,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/supply-calculator.ts b/packages/core-utils/src/supply-calculator.ts index 74a0f26812..7240794eb6 100644 --- a/packages/core-utils/src/supply-calculator.ts +++ b/packages/core-utils/src/supply-calculator.ts @@ -7,16 +7,15 @@ import { Bignum, configManager } from "@arkecosystem/crypto"; * @return {Number} */ function calculate(height) { - const config = app.resolvePlugin("config"); - const network = config.network; + const { genesisBlock, milestones } = app.resolvePlugin("config"); 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/crypto/__tests__/managers/config.test.ts b/packages/crypto/__tests__/managers/config.test.ts index 9998ae4253..32b794f3e8 100644 --- a/packages/crypto/__tests__/managers/config.test.ts +++ b/packages/crypto/__tests__/managers/config.test.ts @@ -32,8 +32,8 @@ describe("Configuration", () => { expect(configManager.get("nethash")).toBe("2a44f340d76ffc3df204c5f38cd355b7496c9065a1ade2ef92071436bd72e867"); }); - it("should build constants", () => { - expect(configManager.constants).toEqual(devnet.milestones); + it("should build milestones", () => { + expect(configManager.milestones).toEqual(devnet.milestones); }); it("should build fees", () => { @@ -64,7 +64,7 @@ describe("Configuration", () => { expect(dynamicFeeManager.get(TRANSACTION_TYPES.DELEGATE_RESIGNATION)).toEqual(addonBytes.delegateResignation); }); - it("should get constants for height", () => { + it("should get milestone for height", () => { expect(configManager.getMilestone(21600)).toEqual(devnet.milestones[2]); }); diff --git a/packages/crypto/src/managers/config.ts b/packages/crypto/src/managers/config.ts index 002e98bb72..b36e8d99c8 100644 --- a/packages/crypto/src/managers/config.ts +++ b/packages/crypto/src/managers/config.ts @@ -13,6 +13,8 @@ export class ConfigManager { public height: any; public constant: any; public constants: any; + public milestones: any; + public dynamicFees: any; /** * @constructor @@ -33,7 +35,7 @@ export class ConfigManager { this.config[key] = value; } - this.config.constants = config.milestones; + this.config.milestones = config.milestones; this.config.dynamicFees = config.dynamicFees; this.buildConstants(); @@ -43,21 +45,21 @@ export class ConfigManager { /** * Set the configuration based on a preset. - * @param {String} coin + * @param {String} token * @param {String} network */ - public setFromPreset(coin, network) { - this.setConfig(CONFIGURATIONS[coin.toUpperCase()][network.toUpperCase()]); + public setFromPreset(token, network) { + this.setConfig(this.getPreset(token, network)); } /** * Get the configuration for a preset. - * @param {String} coin + * @param {String} token * @param {String} network * @return {Object} */ - public getFromPreset(coin, network) { - return CONFIGURATIONS[coin.toUpperCase()][network.toUpperCase()]; + public getPreset(token, network) { + return CONFIGURATIONS[token.toUpperCase()][network.toUpperCase()]; } /** @@ -145,7 +147,7 @@ export class ConfigManager { * Build constant data based on active heights. */ private buildConstants() { - this.constants = this.config.constants.sort((a, b) => a.height - b.height); + this.constants = this.config.milestones.sort((a, b) => a.height - b.height); this.constant = { index: 0, data: this.constants[0], From 6c01289cbe664230017d3236813d501010c51c41 Mon Sep 17 00:00:00 2001 From: Brian Faust Date: Sat, 15 Dec 2018 16:07:57 +0200 Subject: [PATCH 25/63] test: replace constants with milestones --- packages/core-config/__tests__/loader.test.ts | 2 +- packages/crypto/__tests__/managers/config.test.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/core-config/__tests__/loader.test.ts b/packages/core-config/__tests__/loader.test.ts index 56cd049a78..19f3d66696 100644 --- a/packages/core-config/__tests__/loader.test.ts +++ b/packages/core-config/__tests__/loader.test.ts @@ -38,7 +38,7 @@ describe("Config Loader", () => { expect(loader.genesisBlock).toEqual(stubConfig.genesisBlock); expect(loader.network).toContainAllKeys([ ...Object.keys(stubConfig.network.network), - ...["constants", "dynamicFees"], + ...["milestones", "dynamicFees"], ]); }); }); diff --git a/packages/crypto/__tests__/managers/config.test.ts b/packages/crypto/__tests__/managers/config.test.ts index 32b794f3e8..6cd93cfac6 100644 --- a/packages/crypto/__tests__/managers/config.test.ts +++ b/packages/crypto/__tests__/managers/config.test.ts @@ -18,7 +18,7 @@ describe("Configuration", () => { expect(configManager.all()).toContainAllKeys([ ...Object.keys(mainnet.network), - ...["constants", "dynamicFees"], + ...["milestones", "dynamicFees"], ]); }); From da31ef14a16486390e7ac2a94c9eb1f4a8ce7e4f Mon Sep 17 00:00:00 2001 From: Brian Faust Date: Sat, 15 Dec 2018 16:15:33 +0200 Subject: [PATCH 26/63] test(crypto): expect constants to be build --- packages/crypto/__tests__/managers/config.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/crypto/__tests__/managers/config.test.ts b/packages/crypto/__tests__/managers/config.test.ts index 6cd93cfac6..5e2a9c2ed8 100644 --- a/packages/crypto/__tests__/managers/config.test.ts +++ b/packages/crypto/__tests__/managers/config.test.ts @@ -32,8 +32,8 @@ describe("Configuration", () => { expect(configManager.get("nethash")).toBe("2a44f340d76ffc3df204c5f38cd355b7496c9065a1ade2ef92071436bd72e867"); }); - it("should build milestones", () => { - expect(configManager.milestones).toEqual(devnet.milestones); + it("should build constants", () => { + expect(configManager.constants).toEqual(devnet.milestones); }); it("should build fees", () => { From 32da931f3d1d2272166bfb9885f45e2ca7bd7e8a Mon Sep 17 00:00:00 2001 From: Brian Faust Date: Sat, 15 Dec 2018 17:27:12 +0200 Subject: [PATCH 27/63] refactor(crypto): rename constants to milestones --- .../crypto/__tests__/managers/config.test.ts | 4 +-- packages/crypto/src/managers/config.ts | 33 +++++++++---------- 2 files changed, 18 insertions(+), 19 deletions(-) diff --git a/packages/crypto/__tests__/managers/config.test.ts b/packages/crypto/__tests__/managers/config.test.ts index 5e2a9c2ed8..6cd93cfac6 100644 --- a/packages/crypto/__tests__/managers/config.test.ts +++ b/packages/crypto/__tests__/managers/config.test.ts @@ -32,8 +32,8 @@ describe("Configuration", () => { expect(configManager.get("nethash")).toBe("2a44f340d76ffc3df204c5f38cd355b7496c9065a1ade2ef92071436bd72e867"); }); - it("should build constants", () => { - expect(configManager.constants).toEqual(devnet.milestones); + it("should build milestones", () => { + expect(configManager.milestones).toEqual(devnet.milestones); }); it("should build fees", () => { diff --git a/packages/crypto/src/managers/config.ts b/packages/crypto/src/managers/config.ts index b36e8d99c8..76dec93756 100644 --- a/packages/crypto/src/managers/config.ts +++ b/packages/crypto/src/managers/config.ts @@ -11,8 +11,7 @@ import { devnet } from "../networks/ark"; export class ConfigManager { public config: any; public height: any; - public constant: any; - public constants: any; + public milestone: any; public milestones: any; public dynamicFees: any; @@ -128,36 +127,36 @@ 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. */ private buildConstants() { - this.constants = this.config.milestones.sort((a, b) => a.height - b.height); - this.constant = { + 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++; } } From eba965a8712981bcfceddc08d2566cd4e79079d7 Mon Sep 17 00:00:00 2001 From: Brian Faust Date: Sun, 16 Dec 2018 11:05:39 +0200 Subject: [PATCH 28/63] refactor(crypto): clean up some old constants code --- .../crypto/__tests__/crypto/slots.test.ts | 6 ---- packages/crypto/src/crypto/slots.ts | 28 +++++++++---------- packages/crypto/src/managers/config.ts | 23 ++++----------- 3 files changed, 19 insertions(+), 38 deletions(-) diff --git a/packages/crypto/__tests__/crypto/slots.test.ts b/packages/crypto/__tests__/crypto/slots.test.ts index 72e21285e1..044a44cbc6 100644 --- a/packages/crypto/__tests__/crypto/slots.test.ts +++ b/packages/crypto/__tests__/crypto/slots.test.ts @@ -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/src/crypto/slots.ts b/packages/crypto/src/crypto/slots.ts index 6e81bba1de..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.getMilestone(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/managers/config.ts b/packages/crypto/src/managers/config.ts index 76dec93756..01874d9dc4 100644 --- a/packages/crypto/src/managers/config.ts +++ b/packages/crypto/src/managers/config.ts @@ -103,15 +103,6 @@ export class ConfigManager { return this.height; } - /** - * Get specific config constant based on height 1. - * @param {String} key - * @return {*} - */ - public getConstant(key) { - return this.getMilestone()[key]; - } - /** * Get all config constants based on height. * @param {(Number|undefined)} height @@ -164,21 +155,17 @@ export class ConfigManager { * Build fees from config constants. */ private buildFees() { - Object.keys(TRANSACTION_TYPES).forEach(type => - feeManager.set(TRANSACTION_TYPES[type], this.getConstant("fees").staticFees[camelCase(type)]), - ); + for (const type of Object.keys(TRANSACTION_TYPES)) { + feeManager.set(TRANSACTION_TYPES[type], this.getMilestone().fees.staticFees[camelCase(type)]); + } } /** * Build addon bytes from config constants. */ private buildAddonBytes() { - const dynamicFees = this.config.dynamicFees; - - if (dynamicFees.addonBytes) { - Object.keys(TRANSACTION_TYPES).forEach(type => - dynamicFeeManager.set(TRANSACTION_TYPES[type], dynamicFees.addonBytes[camelCase(type)]), - ); + for (const type of Object.keys(TRANSACTION_TYPES)) { + dynamicFeeManager.set(TRANSACTION_TYPES[type], this.config.dynamicFees.addonBytes[camelCase(type)]); } } } From 3e77336ad2e28bc3aedf63011658eb690982a87f Mon Sep 17 00:00:00 2001 From: Brian Faust Date: Sun, 16 Dec 2018 11:14:22 +0200 Subject: [PATCH 29/63] refactor: exit if any errors during the config setup --- packages/core-config/src/loader.ts | 41 ++++++++++++---------- packages/core-container/src/environment.ts | 22 +++++------- 2 files changed, 30 insertions(+), 33 deletions(-) diff --git a/packages/core-config/src/loader.ts b/packages/core-config/src/loader.ts index 5a79c5b256..339aca0354 100644 --- a/packages/core-config/src/loader.ts +++ b/packages/core-config/src/loader.ts @@ -25,21 +25,25 @@ export class Loader { public async setUp(options: object = {}): Promise { this.options = options; - const { value, error } = Joi.validate(JSON.parse(process.env.ARK_NETWORK), schema); + try { + const { value, error } = Joi.validate(JSON.parse(process.env.ARK_NETWORK), schema); - if (error) { - console.error(error.message); - process.exit(1); - } + if (error) { + throw error; + } - await this.__createFromDirectory(); + await this.createFromDirectory(); - configManager.setConfig(value); + configManager.setConfig(value); - // TODO: change once the config object has been implemented - this.network = configManager.all(); - this.milestones = configManager.get("milestones"); - this.dynamicFees = configManager.get("dynamicFees"); + // TODO: change once the config object has been implemented + this.network = configManager.all(); + this.milestones = configManager.get("milestones"); + this.dynamicFees = configManager.get("dynamicFees"); + } catch (error) { + console.error(error.message); + process.exit(1); + } } public get(key: string, defaultValue: any = null): any { @@ -65,12 +69,12 @@ export class Loader { * Load and bind the config. * @return {void} */ - public async __createFromDirectory(): Promise { - const files: Record = this.__getFiles(); + private async createFromDirectory(): Promise { + const files: Record = this.getFiles(); - this.__createBindings(files); + this.createBindings(files); - await this.__buildPeers(files.peers); + await this.buildPeers(files.peers); } /** @@ -78,7 +82,7 @@ export class Loader { * @param {Object} files * @return {void} */ - public __createBindings(files: Record): void { + private createBindings(files: Record): void { for (const [key, value] of Object.entries(files)) { this[key] = require(value); } @@ -88,12 +92,11 @@ export class Loader { * Get all config files. * @return {Object} */ - public __getFiles(): Record { + 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."); - process.exit(1); } const configTree = {}; @@ -111,7 +114,7 @@ export class Loader { * @param {String} configFile * @return {void} */ - public async __buildPeers(configFile: string): Promise { + private async buildPeers(configFile: string): Promise { if (this.peers.sources) { const output = require(configFile); diff --git a/packages/core-container/src/environment.ts b/packages/core-container/src/environment.ts index 000b148815..353adc1104 100644 --- a/packages/core-container/src/environment.ts +++ b/packages/core-container/src/environment.ts @@ -4,31 +4,27 @@ 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.exportNetwork(); + 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)) { @@ -42,7 +38,7 @@ export class Environment { * Export all network variables for the core environment. * @return {void} */ - public __exportNetwork() { + private exportNetwork() { let config; if (this.variables.token && this.variables.network) { @@ -61,7 +57,6 @@ export class Environment { 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); @@ -72,9 +67,8 @@ export class Environment { * 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; } From 13827f027a8931d0d764c31cbc7864c4f5bcef91 Mon Sep 17 00:00:00 2001 From: Brian Faust Date: Sun, 16 Dec 2018 11:19:27 +0200 Subject: [PATCH 30/63] refactor(core-container): load milestones via remote loader --- packages/core-container/src/remote-loader.ts | 60 +++++++++++--------- 1 file changed, 34 insertions(+), 26 deletions(-) diff --git a/packages/core-container/src/remote-loader.ts b/packages/core-container/src/remote-loader.ts index 9a89584bfb..60e5ad2891 100644 --- a/packages/core-container/src/remote-loader.ts +++ b/packages/core-container/src/remote-loader.ts @@ -8,42 +8,50 @@ 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.configureMilestones(); - await this.__configurePeers(); + await this.configureGenesisBlock(); - await this.__configureDelegates(); + await this.configurePeers(); - this.__configurePlugins(network); + await this.configureDelegates(); - this.__configureDatabase(network); + 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 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 +60,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 +94,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 +102,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 +110,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`); } } From c7a1be17629f97f6d2d054971da46c6a1e24ede0 Mon Sep 17 00:00:00 2001 From: Brian Faust Date: Sun, 16 Dec 2018 12:00:57 +0200 Subject: [PATCH 31/63] refactor: move the remote loader to core-config --- .../__tests__/v2/handlers/delegates.test.ts | 4 +-- .../__tests__/remote-loader.test.ts | 4 +-- packages/core-config/src/index.ts | 13 ++++++-- .../src/{loader.ts => loaders/file-loader.ts} | 4 +-- packages/core-config/src/loaders/index.ts | 4 +++ .../src/loaders}/remote-loader.ts | 0 packages/core-container/src/container.ts | 32 +++++++++---------- .../core-container/src/registrars/plugin.ts | 1 - .../__tests__/repositories/delegates.test.ts | 8 ++--- 9 files changed, 40 insertions(+), 30 deletions(-) rename packages/{core-container => core-config}/__tests__/remote-loader.test.ts (97%) rename packages/core-config/src/{loader.ts => loaders/file-loader.ts} (98%) create mode 100644 packages/core-config/src/loaders/index.ts rename packages/{core-container/src => core-config/src/loaders}/remote-loader.ts (100%) 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-container/__tests__/remote-loader.test.ts b/packages/core-config/__tests__/remote-loader.test.ts similarity index 97% rename from packages/core-container/__tests__/remote-loader.test.ts rename to packages/core-config/__tests__/remote-loader.test.ts index 6174b2635d..31a3f5f67c 100644 --- a/packages/core-container/__tests__/remote-loader.test.ts +++ b/packages/core-config/__tests__/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/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(); }); diff --git a/packages/core-config/src/index.ts b/packages/core-config/src/index.ts index 1e2d081d87..929268fcb5 100644 --- a/packages/core-config/src/index.ts +++ b/packages/core-config/src/index.ts @@ -1,10 +1,19 @@ -import { Loader } from "./loader"; +import { FileLoader, RemoteLoader } from "./loaders"; export const plugin = { pkg: require("../package.json"), alias: "config", async register(container, options) { - const loader = new Loader(); + const variables = container.variables; + + // Check if we need to retrieve remote configuration files! + if (variables.remote) { + const remoteLoader = new RemoteLoader(variables); + await remoteLoader.setUp(); + } + + // Load the local configuration files + const loader = new FileLoader(); await loader.setUp(options); return loader; diff --git a/packages/core-config/src/loader.ts b/packages/core-config/src/loaders/file-loader.ts similarity index 98% rename from packages/core-config/src/loader.ts rename to packages/core-config/src/loaders/file-loader.ts index 339aca0354..5929d9f94f 100644 --- a/packages/core-config/src/loader.ts +++ b/packages/core-config/src/loaders/file-loader.ts @@ -5,9 +5,9 @@ import Joi from "joi"; import get from "lodash/get"; import set from "lodash/set"; import { basename, extname, resolve } from "path"; -import { schema } from "./schema"; +import { schema } from "../schema"; -export class Loader { +export class FileLoader { public network: any; public peers: any; public delegates: any; diff --git a/packages/core-config/src/loaders/index.ts b/packages/core-config/src/loaders/index.ts new file mode 100644 index 0000000000..6d1ff138aa --- /dev/null +++ b/packages/core-config/src/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-config/src/loaders/remote-loader.ts similarity index 100% rename from packages/core-container/src/remote-loader.ts rename to packages/core-config/src/loaders/remote-loader.ts diff --git a/packages/core-container/src/container.ts b/packages/core-container/src/container.ts index d488920d0f..6f5a3a99f2 100644 --- a/packages/core-container/src/container.ts +++ b/packages/core-container/src/container.ts @@ -1,9 +1,9 @@ import { createContainer } from "awilix"; +import { execSync } from "child_process"; import delay from "delay"; import semver from "semver"; import { Environment } from "./environment"; import { PluginRegistrar } from "./registrars/plugin"; -import { RemoteLoader } from "./remote-loader"; export class Container { public container: any; @@ -11,11 +11,11 @@ export class Container { 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; /** * Create a new container instance. @@ -23,7 +23,6 @@ export class Container { */ constructor() { this.container = createContainer(); - this.exitEvents = ["SIGINT", "exit"]; /** * May be used by CLI programs to suppress the shutdown @@ -36,13 +35,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"]); } /** @@ -52,21 +55,16 @@ export class Container { * @param {Object} options * @return {void} */ - public async setUp(version, variables, options: any = {}) { + public async setUp(version: string, variables: any, options: any = {}) { this.options = options; - - this.__registerExitHandler(); + 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; @@ -229,7 +227,7 @@ export class Container { * Handle any exit signals. * @return {void} */ - public __registerExitHandler() { + private registerExitHandler(exitEvents: string[]) { const handleExit = async () => { if (this.shuttingDown) { return; @@ -266,6 +264,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/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/__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)", () => { From ecc1aceccbdd42802a6f924fdbe04135f1b8c4d7 Mon Sep 17 00:00:00 2001 From: Brian Faust Date: Sun, 16 Dec 2018 12:07:36 +0200 Subject: [PATCH 32/63] test(core-config): use correct stub paths --- .../{loader.test.ts => loaders/file-loader.test.ts} | 12 ++++++------ .../__tests__/{ => loaders}/remote-loader.test.ts | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) rename packages/core-config/__tests__/{loader.test.ts => loaders/file-loader.test.ts} (73%) rename packages/core-config/__tests__/{ => loaders}/remote-loader.test.ts (98%) diff --git a/packages/core-config/__tests__/loader.test.ts b/packages/core-config/__tests__/loaders/file-loader.test.ts similarity index 73% rename from packages/core-config/__tests__/loader.test.ts rename to packages/core-config/__tests__/loaders/file-loader.test.ts index 19f3d66696..fce016bbc5 100644 --- a/packages/core-config/__tests__/loader.test.ts +++ b/packages/core-config/__tests__/loaders/file-loader.test.ts @@ -1,19 +1,19 @@ import "jest-extended"; import { resolve } from "path"; -import { Loader } from "../src/loader"; +import { FileLoader } from "../../src/loaders"; -const stubConfigPath = resolve(__dirname, "./__stubs__"); +const stubConfigPath = resolve(__dirname, "../__stubs__"); const stubConfig = { - delegates: require("./__stubs__/delegates"), - genesisBlock: require("./__stubs__/genesisBlock"), - network: require("./__stubs__/network"), + delegates: require(resolve(__dirname, "../__stubs__/delegates")), + genesisBlock: require(resolve(__dirname, "../__stubs__/genesisBlock")), + network: require(resolve(__dirname, "../__stubs__/network")), }; let loader; beforeEach(() => { - loader = new Loader(); + loader = new FileLoader(); process.env.ARK_PATH_CONFIG = stubConfigPath; process.env.ARK_NETWORK = JSON.stringify(stubConfig.network); }); diff --git a/packages/core-config/__tests__/remote-loader.test.ts b/packages/core-config/__tests__/loaders/remote-loader.test.ts similarity index 98% rename from packages/core-config/__tests__/remote-loader.test.ts rename to packages/core-config/__tests__/loaders/remote-loader.test.ts index 31a3f5f67c..31337020a1 100644 --- a/packages/core-config/__tests__/remote-loader.test.ts +++ b/packages/core-config/__tests__/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/loaders"; +import { RemoteLoader } from "../../src/loaders"; const axiosMock = new MockAdapter(axios); const configDir = "./__test-remote-config__"; From 971ac0e63dc3539a0bf61973bd0164de9cab8fb6 Mon Sep 17 00:00:00 2001 From: Brian Faust Date: Sun, 16 Dec 2018 15:09:31 +0200 Subject: [PATCH 33/63] refactor: merge core-config into core-container --- .circleci/config.yml | 162 ++-- README.md | 1 - greenkeeper.json | 1 - .../src/plugins/validation/formats/address.ts | 2 +- .../src/versions/1/accounts/controller.ts | 2 +- .../src/versions/1/blocks/controller.ts | 2 +- .../src/versions/1/delegates/controller.ts | 2 +- .../src/versions/1/delegates/schema.ts | 2 +- .../src/versions/1/loader/controller.ts | 2 +- .../src/versions/1/peers/transformer.ts | 2 +- .../src/versions/1/signatures/controller.ts | 2 +- .../versions/1/transactions/transformer.ts | 2 +- .../src/versions/2/blockchain/controller.ts | 2 +- .../src/versions/2/node/controller.ts | 2 +- .../src/versions/2/peers/transformer.ts | 2 +- .../src/versions/2/transactions/controller.ts | 2 +- .../versions/2/transactions/transformer.ts | 2 +- packages/core-blockchain/src/blockchain.ts | 2 +- packages/core-blockchain/src/state-machine.ts | 2 +- packages/core-config/.gitattributes | 11 - packages/core-config/README.md | 24 - .../__tests__/__stubs__/delegates.json | 3 - .../__tests__/__stubs__/genesisBlock.json | 896 ------------------ .../__stubs__/network/dynamic-fees.json | 16 - .../__tests__/__stubs__/network/index.js | 5 - .../__stubs__/network/milestones.json | 31 - .../__tests__/__stubs__/network/network.json | 18 - .../__tests__/__stubs__/peers.json | 12 - .../__tests__/loaders/file-loader.test.ts | 44 - .../__tests__/loaders/remote-loader.test.ts | 139 --- packages/core-config/package.json | 50 - packages/core-config/src/index.ts | 21 - .../core-config/src/loaders/file-loader.ts | 146 --- packages/core-config/src/loaders/index.ts | 4 - .../core-config/src/loaders/remote-loader.ts | 120 --- packages/core-config/src/schema.ts | 86 -- packages/core-config/tsconfig.json | 7 - packages/core-container/package.json | 6 + packages/core-container/src/container.ts | 9 + packages/core-container/src/environment.ts | 30 - packages/core-database-postgres/src/spv.ts | 2 +- packages/core-database/src/interface.ts | 2 +- packages/core-database/src/wallet-manager.ts | 2 +- packages/core-forger/src/client.ts | 2 +- packages/core-forger/src/manager.ts | 2 +- .../src/server/services/network.ts | 2 +- packages/core-p2p/src/court/guard.ts | 2 +- packages/core-p2p/src/monitor.ts | 2 +- packages/core-p2p/src/peer.ts | 2 +- .../src/server/plugins/set-headers.ts | 2 +- .../src/server/versions/1/handlers.ts | 2 +- .../server/versions/config/handlers/index.ts | 2 +- .../versions/internal/handlers/rounds.ts | 2 +- .../internal/handlers/transactions.ts | 2 +- packages/core-p2p/src/utils/network-state.ts | 2 +- .../core-snapshots-cli/src/utils/index.ts | 1 - packages/core-snapshots/src/db/index.ts | 2 +- packages/core-snapshots/src/manager.ts | 2 +- .../src/config/testnet/plugins.js | 1 - .../__tests__/connection.test.ts | 2 +- .../__tests__/supply-calculator.test.ts | 2 +- .../core-utils/src/delegate-calculator.ts | 2 +- packages/core-utils/src/format-timestamp.ts | 2 +- packages/core-utils/src/round-calculator.ts | 4 +- packages/core-utils/src/supply-calculator.ts | 2 +- packages/core-vote-report/src/handler.ts | 2 +- .../__tests__/__support__/config/plugins.js | 1 - packages/core/package.json | 1 - packages/core/src/commands/index.ts | 1 - packages/core/src/config/devnet/plugins.js | 1 - packages/core/src/config/mainnet/plugins.js | 1 - packages/core/src/config/testnet.1/plugins.js | 1 - packages/core/src/config/testnet.2/plugins.js | 1 - .../core/src/config/testnet.live/plugins.js | 1 - packages/core/src/config/testnet/plugins.js | 1 - 75 files changed, 130 insertions(+), 1805 deletions(-) delete mode 100644 packages/core-config/.gitattributes delete mode 100644 packages/core-config/README.md delete mode 100644 packages/core-config/__tests__/__stubs__/delegates.json delete mode 100644 packages/core-config/__tests__/__stubs__/genesisBlock.json delete mode 100644 packages/core-config/__tests__/__stubs__/network/dynamic-fees.json delete mode 100644 packages/core-config/__tests__/__stubs__/network/index.js delete mode 100644 packages/core-config/__tests__/__stubs__/network/milestones.json delete mode 100644 packages/core-config/__tests__/__stubs__/network/network.json delete mode 100644 packages/core-config/__tests__/__stubs__/peers.json delete mode 100644 packages/core-config/__tests__/loaders/file-loader.test.ts delete mode 100644 packages/core-config/__tests__/loaders/remote-loader.test.ts delete mode 100644 packages/core-config/package.json delete mode 100644 packages/core-config/src/index.ts delete mode 100644 packages/core-config/src/loaders/file-loader.ts delete mode 100644 packages/core-config/src/loaders/index.ts delete mode 100644 packages/core-config/src/loaders/remote-loader.ts delete mode 100644 packages/core-config/src/schema.ts delete mode 100644 packages/core-config/tsconfig.json 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/src/plugins/validation/formats/address.ts b/packages/core-api/src/plugins/validation/formats/address.ts index 9239a82a6d..dc3008a637 100644 --- a/packages/core-api/src/plugins/validation/formats/address.ts +++ b/packages/core-api/src/plugins/validation/formats/address.ts @@ -2,7 +2,7 @@ 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", diff --git a/packages/core-api/src/versions/1/accounts/controller.ts b/packages/core-api/src/versions/1/accounts/controller.ts index 65f00f6bef..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"); } diff --git a/packages/core-api/src/versions/1/blocks/controller.ts b/packages/core-api/src/versions/1/blocks/controller.ts index a7e5279b79..1489a83771 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) { diff --git a/packages/core-api/src/versions/1/delegates/controller.ts b/packages/core-api/src/versions/1/delegates/controller.ts index aaa7dbe8b9..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"); } diff --git a/packages/core-api/src/versions/1/delegates/schema.ts b/packages/core-api/src/versions/1/delegates/schema.ts index 24443082f0..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").getMilestone(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..1285c7d301 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) { diff --git a/packages/core-api/src/versions/1/peers/transformer.ts b/packages/core-api/src/versions/1/peers/transformer.ts index e7f71d734a..49046400a5 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, diff --git a/packages/core-api/src/versions/1/signatures/controller.ts b/packages/core-api/src/versions/1/signatures/controller.ts index 576d6cedb4..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) { diff --git a/packages/core-api/src/versions/1/transactions/transformer.ts b/packages/core-api/src/versions/1/transactions/transformer.ts index e211a5ad64..76a0e6aafd 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")); 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 4b4b2126ae..058d149923 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"); } diff --git a/packages/core-api/src/versions/2/peers/transformer.ts b/packages/core-api/src/versions/2/peers/transformer.ts index 66d09edb30..447fc6abb5 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, diff --git a/packages/core-api/src/versions/2/transactions/controller.ts b/packages/core-api/src/versions/2/transactions/controller.ts index d5f634a34c..40fc6161ba 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"); } diff --git a/packages/core-api/src/versions/2/transactions/transformer.ts b/packages/core-api/src/versions/2/transactions/transformer.ts index 67838d385e..eb19632955 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")); diff --git a/packages/core-blockchain/src/blockchain.ts b/packages/core-blockchain/src/blockchain.ts index bc132a5cbe..49f64664f4 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; diff --git a/packages/core-blockchain/src/state-machine.ts b/packages/core-blockchain/src/state-machine.ts index 69d1051fdf..52711ddd69 100644 --- a/packages/core-blockchain/src/state-machine.ts +++ b/packages/core-blockchain/src/state-machine.ts @@ -12,7 +12,7 @@ import { stateStorage } from "./state-storage"; import { tickSyncTracker } from "./utils/tick-sync-tracker"; const { Block } = models; -const config = app.resolvePlugin("config"); +const config = app.getConfig(); const emitter = app.resolvePlugin("event-emitter"); const logger = app.resolvePlugin("logger"); 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__/delegates.json b/packages/core-config/__tests__/__stubs__/delegates.json deleted file mode 100644 index cb2b4899cd..0000000000 --- a/packages/core-config/__tests__/__stubs__/delegates.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "secrets": ["this is a test"] -} diff --git a/packages/core-config/__tests__/__stubs__/genesisBlock.json b/packages/core-config/__tests__/__stubs__/genesisBlock.json deleted file mode 100644 index 83801fa8e0..0000000000 --- a/packages/core-config/__tests__/__stubs__/genesisBlock.json +++ /dev/null @@ -1,896 +0,0 @@ -{ - "version": 0, - "totalAmount": 12500000000000000, - "totalFee": 0, - "reward": 0, - "payloadHash": "578e820911f24e039733b45e4882b73e301f813a0d2c31330dafda84534ffa23", - "timestamp": 0, - "numberOfTransactions": 52, - "payloadLength": 11401, - "previousBlock": null, - "generatorPublicKey": "024c8247388a02ecd1de2a3e3fd5b7c61ecc2797fa3776599d558333ef1802d231", - "transactions": [ - { - "type": 0, - "amount": 12500000000000000, - "fee": 0, - "recipientId": "DGihocTkwDygiFvmg6aG8jThYTic47GzU9", - "timestamp": 0, - "asset": {}, - "senderPublicKey": "03cb7bca143376721d0e9e3f3ccb0dc2e7e8470c06e630c3cef73f03e309b558ad", - "signature": "3044022016ecdf3039e69514c7d75861b22fc076496b61c07a1fcf793dc4f5c76fa0532b0220579c4c0c9d13720f9db5d9df29ed8ceab0adc266c6c160d612d4894dc5867eb1", - "id": "e40ce11cab82736da1cc91191716f3c1f446ca7b6a9f4f93b7120ef105ba06e8", - "senderId": "DUFeXjJmYt1mWY3auywA1EQSqfCv5kYYfP" - }, - { - "type": 2, - "amount": 0, - "fee": 0, - "recipientId": null, - "senderPublicKey": "03e5b39a83e6c7c952c5908089d4524bb8dda93acc2b2b953247e43dc4fe9aa3d1", - "timestamp": 0, - "asset": { - "delegate": { - "username": "genesis_1", - "publicKey": "03e5b39a83e6c7c952c5908089d4524bb8dda93acc2b2b953247e43dc4fe9aa3d1" - } - }, - "signature": "3045022100e3e38811778023e6f17fefd447f179d45ab92c398c7cfb1e34e2f6e1b167c95a022070c36439ecec0fc3c43850070f29515910435d389e059579878d61b5ff2ea337", - "id": "eb0146ac79afc228f0474a5ae1c4771970ae7880450b998c401029f522cd8a21", - "senderId": "DNL81CT6WNG1PHjobBmLvKwLV3UUscBymB" - }, - { - "type": 2, - "amount": 0, - "fee": 0, - "recipientId": null, - "senderPublicKey": "031137050d5fed0b5229b150257da2ac9c135efdf4bcb382b0ad0c197d7be458f4", - "timestamp": 0, - "asset": { - "delegate": { - "username": "genesis_3", - "publicKey": "031137050d5fed0b5229b150257da2ac9c135efdf4bcb382b0ad0c197d7be458f4" - } - }, - "signature": "30440220124baaa04491287d0abbf5a167c9b0f5ac95c22b196f42ff3d275cc9a213c2fd02206e6ebada85f67063e642dbcde6b956f8c99c05f4b9c55f1551d3eebba6375043", - "id": "c9c554056b3428951633a7059dd64dfcbd776fef7f4a156ea362b37ee6ce74c7", - "senderId": "DG9LYv5rqX67wuGvGVa9is5k1r86LKCVTA" - }, - { - "type": 2, - "amount": 0, - "fee": 0, - "recipientId": null, - "senderPublicKey": "037def83d085778d7767a182a179f345207953441089081f5bc13f86d3891308aa", - "timestamp": 0, - "asset": { - "delegate": { - "username": "genesis_4", - "publicKey": "037def83d085778d7767a182a179f345207953441089081f5bc13f86d3891308aa" - } - }, - "signature": "3045022100900cea3c2df393414899c9d74db57d89c9f311c70d08b974d0fd4a98bfae2fc902204a2aa51a1ec71da27c26afc033de6bd2d15978813c120c95e1a4dafca75ce876", - "id": "c82ccaa16be0e3c7ff4a53e2807968b71a0d88115223c3af2eb320f32449ac32", - "senderId": "DMSwarrHg5N9ZAZ6nsqPuUjyAU6gdRAM9d" - }, - { - "type": 2, - "amount": 0, - "fee": 0, - "recipientId": null, - "senderPublicKey": "033f28ad2e9b897d46f1e67c7c52070e9ca46b04c0679ebb21fb236719e38aade3", - "timestamp": 0, - "asset": { - "delegate": { - "username": "genesis_5", - "publicKey": "033f28ad2e9b897d46f1e67c7c52070e9ca46b04c0679ebb21fb236719e38aade3" - } - }, - "signature": "30440220285188d8900cd3cffccf5e1de305b18856451dd04d2ed21165dffe9a7ce4afc1022009457be6bfe536971697105d47ad1f829738a5cacdb27a23c5d1e8a8dddf3ebd", - "id": "ee6a19fff622ab4e6e96d159396de56d6034b4b18a9cf5c99efcf4e61b28e15a", - "senderId": "DFcYHfCwhGWcBNy6cp48wy5SfXbQmfBYgT" - }, - { - "type": 2, - "amount": 0, - "fee": 0, - "recipientId": null, - "senderPublicKey": "023e577a7b3362e0aba70e6911d230e86d729b4cb640f0e0b25637b812a3e38b53", - "timestamp": 0, - "asset": { - "delegate": { - "username": "genesis_6", - "publicKey": "023e577a7b3362e0aba70e6911d230e86d729b4cb640f0e0b25637b812a3e38b53" - } - }, - "signature": "3045022100afa56542dd473c424b36d4d9f24da68180cfd90527681ab84098f415b2544a8702201e8ebdd619a2dd200e37a57c39a4529afe76d35f6089c00f6dffba6bf7b8a836", - "id": "0dcd6e380bd7eaef8724f64f4b86104ce7497308dacf775afbe6ec0d401007fe", - "senderId": "D5e2FzTPqdEHridjzpFZCCVyepAu6Vpmk4" - }, - { - "type": 2, - "amount": 0, - "fee": 0, - "recipientId": null, - "senderPublicKey": "02af5e6341efc14f4ba39a9ff65e151cc7304fc742ce7b2678d9aa446c555ee9c1", - "timestamp": 0, - "asset": { - "delegate": { - "username": "genesis_7", - "publicKey": "02af5e6341efc14f4ba39a9ff65e151cc7304fc742ce7b2678d9aa446c555ee9c1" - } - }, - "signature": "3045022100c8980155c8f8964d76baf3e8d690075708f1a84757c1de52e311772466382da2022012599acfc7839fa1ef6bbd445ab34555fb718491db3089f40d4842b1bc2d3178", - "id": "8af6abb117c69c130e388970d595b741374b1bbca709d9e91459e9e3c721397b", - "senderId": "DDLbnve6XK48cGsQiFhesUJQRQdKkZTfPh" - }, - { - "type": 2, - "amount": 0, - "fee": 0, - "recipientId": null, - "senderPublicKey": "02845161cfca4d6ddde8e0d53538b6f881fb3ad9383cd77cebc55375dd6fd17663", - "timestamp": 0, - "asset": { - "delegate": { - "username": "genesis_8", - "publicKey": "02845161cfca4d6ddde8e0d53538b6f881fb3ad9383cd77cebc55375dd6fd17663" - } - }, - "signature": "30450221009bce7c5c10a4b6306cebe5724adfd3de049a425c44dd314a10154774764c11090220070fb775e71dda6a68f7fc9e0c762fbf96021908911f0de0ca8e9b0c613cb896", - "id": "bd346035d4516b85fb3a2cce6260fdcc6f1c434999e586978e065de3bf98e02a", - "senderId": "DDAHPjVTTV3uur653TB27fcLGh7XXWnvxW" - }, - { - "type": 2, - "amount": 0, - "fee": 0, - "recipientId": null, - "senderPublicKey": "03f264a6d2ebb62279313a6fd7fec4e2244785839b625a0b0c261e689ce5401d87", - "timestamp": 0, - "asset": { - "delegate": { - "username": "genesis_9", - "publicKey": "03f264a6d2ebb62279313a6fd7fec4e2244785839b625a0b0c261e689ce5401d87" - } - }, - "signature": "30450221009f74425c2ec50dbee462e735dee3e7917c8433fd5250ff09af4506c38d2df05902206a14a19b9a5defe3c8c59c77d52c182ea34d81d2e0b05dc5925133f2829a1960", - "id": "b48068fb7c848ffd57e82a4d381f53bb69916f3943e0e8935971a028ba245564", - "senderId": "DFHdEBuVCz5zfj8yeo3BmKEdsEKpMaYRRw" - }, - { - "type": 2, - "amount": 0, - "fee": 0, - "recipientId": null, - "senderPublicKey": "03efd265a086c2a099cda4f4fd202adbac07567e1229ce5e6fe39963b714c1e2d5", - "timestamp": 0, - "asset": { - "delegate": { - "username": "genesis_10", - "publicKey": "03efd265a086c2a099cda4f4fd202adbac07567e1229ce5e6fe39963b714c1e2d5" - } - }, - "signature": "3044022004df492965ed328134aa6443d38ac4dd951a640e00330da9aa4e80c1577af41a0220588f030f5f9584959647898bb977a1ffe6bba639b1c64a728880f2cd3fd7aa3c", - "id": "73b3b4375e39aabe51ec205559cd728a18c987dabaa0599c611b3076c38c7a49", - "senderId": "DL7Y6smfHHs3Ms3hAYmSYYd5PZukmtDY1i" - }, - { - "type": 2, - "amount": 0, - "fee": 0, - "recipientId": null, - "senderPublicKey": "027d616d20f03c375067676c79ff9787e8e42991fbd9e878501d704d23d246d9b0", - "timestamp": 0, - "asset": { - "delegate": { - "username": "genesis_11", - "publicKey": "027d616d20f03c375067676c79ff9787e8e42991fbd9e878501d704d23d246d9b0" - } - }, - "signature": "3044022051c2f8af62163ca621eeb3087a35bfaca0d679f7be8b19a25972f5a4b24ad8c90220422f3e0e480bf1bf2211e871a102edc15a957c0f97a553d9d707418e6538df26", - "id": "80f1d01158452da31d44f0c24f464a0ade37da51d2f61356ad75a019a91a1ff5", - "senderId": "DBVoRSXBHBPPvssBXrswv22r4dUSpN1fbA" - }, - { - "type": 2, - "amount": 0, - "fee": 0, - "recipientId": null, - "senderPublicKey": "038918951152a37b74dfe61115f83e4b5e3521145065650c4a6d3e94add57d9a9b", - "timestamp": 0, - "asset": { - "delegate": { - "username": "genesis_12", - "publicKey": "038918951152a37b74dfe61115f83e4b5e3521145065650c4a6d3e94add57d9a9b" - } - }, - "signature": "3045022100facf6ed992c28d41595419666b006800fcb33c6bad4b522e013b4d688e51dc8502207695e968059f7a35486389c430d6a3037e69d3e5f1d4f0a294d8818e4750cf0d", - "id": "86d76b0aad8f496d8c20926bfdeb50ad10db242ea6152b68266680c48e1e1aca", - "senderId": "DHsSK81gRWjgNx1A9gtHgkRsEwshsog7AM" - }, - { - "type": 2, - "amount": 0, - "fee": 0, - "recipientId": null, - "senderPublicKey": "03231d8f2f39925fa79efc8f8561e6a8d29b95164a753cbb604a46e8a2e96606fc", - "timestamp": 0, - "asset": { - "delegate": { - "username": "genesis_13", - "publicKey": "03231d8f2f39925fa79efc8f8561e6a8d29b95164a753cbb604a46e8a2e96606fc" - } - }, - "signature": "304402204c627ec3d24fb7b4f86709c0566cee9909ebddb26039e87a2fa673f1f7227362022003be5aa3303b8f4cdab768f80b4699440a61814950cab0fd983526771c4c52ec", - "id": "464614909ac7531a016a0489d78defe262dc0934324f41199975ad42a86f37ac", - "senderId": "DDr7UTGQuPTjxLDWZ8RMjWJMKNXAMj3Bor" - }, - { - "type": 2, - "amount": 0, - "fee": 0, - "recipientId": null, - "senderPublicKey": "021e6d971e5885a3147ddf1e45bf5c8d0887ad9fc659e24bdf95c2c9607e7e3fe8", - "timestamp": 0, - "asset": { - "delegate": { - "username": "genesis_14", - "publicKey": "021e6d971e5885a3147ddf1e45bf5c8d0887ad9fc659e24bdf95c2c9607e7e3fe8" - } - }, - "signature": "3045022100898e59efe518745d3eb3f2b16f7b6192e3289bb4289d43013224549f2015aa4902204e7be92cbba37a05551151e46224da4e5d0ad86ee2106d3a9c0b9afee5f1c4cf", - "id": "9559866ff439959529f69b0947ad2e72d739511ee1f6533c0bca2ebd6dd4ae4a", - "senderId": "DRXNNQ9gQXh6VNUVKaAn9xHAViyiHKtBHZ" - }, - { - "type": 2, - "amount": 0, - "fee": 0, - "recipientId": null, - "senderPublicKey": "03d5b3efbe98631443c5cdf4de8a610dd2655b86427bf70aa209451b54256f6758", - "timestamp": 0, - "asset": { - "delegate": { - "username": "genesis_15", - "publicKey": "03d5b3efbe98631443c5cdf4de8a610dd2655b86427bf70aa209451b54256f6758" - } - }, - "signature": "3044022037fa085e37a582b2e0b3734d44b813bb18be939f73100c5b6f977d4f53ae708f022064ae54f6a1b17b193ab6b6d633f7b7a7b8171a158cdba7480afe380f383930dc", - "id": "7bab92d5397a4ad291c5d01b8d681e480d19b437a7ab5cbd4c6807c96ef2716f", - "senderId": "DT12wf9erZyNJbBQrpbPDmfH3J8txiDgTE" - }, - { - "type": 2, - "amount": 0, - "fee": 0, - "recipientId": null, - "senderPublicKey": "0297f2e8e609b2a6799214481e7573a043a197f8adf7b8bb306576fc3da83d2aaa", - "timestamp": 0, - "asset": { - "delegate": { - "username": "genesis_16", - "publicKey": "0297f2e8e609b2a6799214481e7573a043a197f8adf7b8bb306576fc3da83d2aaa" - } - }, - "signature": "304402202eee94bc3b53c64f8dee7790fe3eed8639da8faf0aa1f785e921cf139df0fb7e02200224efb0c07ae3972287c12a32143c1356adb93e00ac9e04a1358c8245a24cab", - "id": "1e59740fa596b615231660974d0b656122b799a8b13102ade8c1b779aa5de7b5", - "senderId": "DKGYWPSqa4m4z6h3433rNFbWPDdvHj5wwd" - }, - { - "type": 2, - "amount": 0, - "fee": 0, - "recipientId": null, - "senderPublicKey": "0361b914fd5823bf39ae467e95d99e9f6ddb7d85cc6df3055ce00274b8e4a976cc", - "timestamp": 0, - "asset": { - "delegate": { - "username": "genesis_17", - "publicKey": "0361b914fd5823bf39ae467e95d99e9f6ddb7d85cc6df3055ce00274b8e4a976cc" - } - }, - "signature": "3044022002ad92b9b9d81dabf96ac7d90034debc55eeeae879b3fe6ffc026bde86bb7ad902205c57d31c5e5e0099b504ba4c49e220a00ff325dceb64c46aefbb7a0ad8570099", - "id": "bf305776da902802923c19b9d2c7f1a809b0847992131cfa578d5e5518c924bf", - "senderId": "DJshaeFyHcFTjiGJnVPaDmFXhnJ9bp96i5" - }, - { - "type": 2, - "amount": 0, - "fee": 0, - "recipientId": null, - "senderPublicKey": "03fa6bc09bd2ff348b304e0cfbc2d2ec50aa3b9aee0de6a66c13fcd8ee5ac891cd", - "timestamp": 0, - "asset": { - "delegate": { - "username": "genesis_18", - "publicKey": "03fa6bc09bd2ff348b304e0cfbc2d2ec50aa3b9aee0de6a66c13fcd8ee5ac891cd" - } - }, - "signature": "3045022100be50b19c17a9ff221aae20394a45d92ea47e8c1072b6d5a302937d2fc48cba8002205e9bcb3471a734c07ceff0083ad9ba1570507a29e5014e889ba42a85e797cb5e", - "id": "44e48364b5b8cff3c68ae03de7dfde8d7ba6bcb99bf82b32fdc8bc3d0d9adeca", - "senderId": "DSuNttSb1UvCWg8iormfwPwi67EA84P5Mu" - }, - { - "type": 2, - "amount": 0, - "fee": 0, - "recipientId": null, - "senderPublicKey": "03241957edca9ed28308e35cbf36762d22de706ebbd7c6a3a2d235d905d660c5c7", - "timestamp": 0, - "asset": { - "delegate": { - "username": "genesis_19", - "publicKey": "03241957edca9ed28308e35cbf36762d22de706ebbd7c6a3a2d235d905d660c5c7" - } - }, - "signature": "3045022100c11f8b863133535192e6c3fff20253a2695a2df74cdf1445d4ca0966803f708c0220200d4c2723d84f6334ba5d1cc1a0d45854867f4523fbcc9d09b3d53dd1972950", - "id": "5cba288f9ffc1361ba8f7f19f28347ffd917f37df8cf46ba1e0816725f288528", - "senderId": "DCZt1ozEVvPdYVvkHmUKK6k7gnyNNQDpMq" - }, - { - "type": 2, - "amount": 0, - "fee": 0, - "recipientId": null, - "senderPublicKey": "035ae2364c838bc21edf4c04a99c85799f26fb02cc0740c5a1c67d4dc1748ff913", - "timestamp": 0, - "asset": { - "delegate": { - "username": "genesis_20", - "publicKey": "035ae2364c838bc21edf4c04a99c85799f26fb02cc0740c5a1c67d4dc1748ff913" - } - }, - "signature": "304402203066f06a1c165795d8a069499a8c0998913ec93e689219f14145754aa3e26e4e02206e9f88da16f1f8a8ebaf481eff798452487738714fe9b5694fec6a5ef8c152a5", - "id": "ada1696532f7faad1dda594bc6db7bfc029a1759402c924348b74222873a3a27", - "senderId": "D7JyqWMPKhhRNQcKTAvrPGBjEjjBcGgPca" - }, - { - "type": 2, - "amount": 0, - "fee": 0, - "recipientId": null, - "senderPublicKey": "023aff4a16c3876e885aea70e5bce9734ce5acc95a2c41c9783f5acd617f7c7533", - "timestamp": 0, - "asset": { - "delegate": { - "username": "genesis_21", - "publicKey": "023aff4a16c3876e885aea70e5bce9734ce5acc95a2c41c9783f5acd617f7c7533" - } - }, - "signature": "3045022100f5150c23596b9479c8b277401ab9e7da9b2275436f3927dabd70395e52c3ea7c02204e318d498b0176b5f05bb96418c49da3375a8d9b47b3b1e72a6f4db30b3f8c34", - "id": "e186a679f2e47300ec2f24c670192bcede1cb12f359cb8e827374b22f41fbe12", - "senderId": "D6itxYJr4n7ZZk2bd9cZbJE1xaDmpfkNFL" - }, - { - "type": 2, - "amount": 0, - "fee": 0, - "recipientId": null, - "senderPublicKey": "0217d7ce9c3754f7fc7e5b4c64a1ff397dc75931cd6c92e32d8b42068ad50fe4eb", - "timestamp": 0, - "asset": { - "delegate": { - "username": "genesis_22", - "publicKey": "0217d7ce9c3754f7fc7e5b4c64a1ff397dc75931cd6c92e32d8b42068ad50fe4eb" - } - }, - "signature": "3045022100b84f69a7ff67ed147fc0a750c3b7b2ecabd582b6d0cb698c0bb4a531daa6ca46022039d2722e486e1674d0db422078d63fcdb90b21bed0dcc1265adff72d0c2bf8b9", - "id": "86d9d146b62dbafe212aba5ec9764223b67f72c3c1aa93e54a270e3a528a8b20", - "senderId": "DDy4aKhF3cMadGhjFZnjaA1tx2rwnSEWcc" - }, - { - "type": 2, - "amount": 0, - "fee": 0, - "recipientId": null, - "senderPublicKey": "024019207f50dcb3e8aeb9ac1b00993d2bf131346e7e6d296429ea813a8373818e", - "timestamp": 0, - "asset": { - "delegate": { - "username": "genesis_23", - "publicKey": "024019207f50dcb3e8aeb9ac1b00993d2bf131346e7e6d296429ea813a8373818e" - } - }, - "signature": "3045022100aa83596b740639ee8947aa6d0f0ee123e4a5b87c39a4c6dd8a50304d4a7c97d102205fd45f85f5bdb076585a77888ef880bea52ade689731dff694d777de34913efc", - "id": "6301b791844e02116df528b1ea46d788e91521189c3828ce224e45a1b72cda59", - "senderId": "D6BwyDJkNFkaDLedcJTE4rPUw5bRtb4K8f" - }, - { - "type": 2, - "amount": 0, - "fee": 0, - "recipientId": null, - "senderPublicKey": "0275db912c21dca0f0213a76f4544137d7c741b47f281cfd4f8b7cb8187e7ce3cc", - "timestamp": 0, - "asset": { - "delegate": { - "username": "genesis_24", - "publicKey": "0275db912c21dca0f0213a76f4544137d7c741b47f281cfd4f8b7cb8187e7ce3cc" - } - }, - "signature": "3045022100c7eda0d9cd7ef522615643d1b985c73add2d3612344bdcc0117779fa4f4f54d302203e33fb5d185f5174e9cb7634a3d307b74d3bb56cc2354024ce69c74905a85203", - "id": "eee776fcb8024469eacab3e4b23c3d14185326431369aa84f17921abab8ad0ad", - "senderId": "DHQSmrRdfYAp9Y6CuebKnkoQNzuN7Pk2oQ" - }, - { - "type": 2, - "amount": 0, - "fee": 0, - "recipientId": null, - "senderPublicKey": "0331c615ca4bc89d4eeb8d7a9cfbb5c0d4ce49d2f480afbce499b0c7f8c6a24f2f", - "timestamp": 0, - "asset": { - "delegate": { - "username": "genesis_25", - "publicKey": "0331c615ca4bc89d4eeb8d7a9cfbb5c0d4ce49d2f480afbce499b0c7f8c6a24f2f" - } - }, - "signature": "304402203e69be3a73c5917d89d58f3c0ae18febbbf364d3f9dfbec6b526a5294f9c435902201750bcf6368c181aabc53c73fd271a2967a6f215e1d0506eded5dd1800fea1c8", - "id": "ec3d17c6d38c0b9848c7cb57b968efd1f3872b1d1b8bcfb74bae2b0aaa15877c", - "senderId": "D6EVFQx5Z7M2X9DWXHtfX51CtVekuKPMQF" - }, - { - "type": 2, - "amount": 0, - "fee": 0, - "recipientId": null, - "senderPublicKey": "0338ca9b719f8047580eed23b64a40aecad3803a12c0dde83e3ec2c2a9bfaa8147", - "timestamp": 0, - "asset": { - "delegate": { - "username": "genesis_26", - "publicKey": "0338ca9b719f8047580eed23b64a40aecad3803a12c0dde83e3ec2c2a9bfaa8147" - } - }, - "signature": "3045022100e0bf90949739012b641793da162b3daa88b34c8753ee31b26850729e9df579810220439a3f2f1b8e719767ee68df46f4bc1f18c8c3b2da4118edff22396616d319fb", - "id": "14cd65c5f28f4cefc7c0157518a24f90c2260eb7166105b6b3358d91164ddf39", - "senderId": "DLCQ1jPsYbBCV7JfUJTasKbKoyGbK4a4HG" - }, - { - "type": 2, - "amount": 0, - "fee": 0, - "recipientId": null, - "senderPublicKey": "03127001718bee76f14133272f0f4a928ffa8c2b38cafd94d7100253dac732c644", - "timestamp": 0, - "asset": { - "delegate": { - "username": "genesis_2", - "publicKey": "03127001718bee76f14133272f0f4a928ffa8c2b38cafd94d7100253dac732c644" - } - }, - "signature": "3044022003d2e76aca2848aedfe25415c11b9368dc72f687b66bef4527b40e2997b86b8c022076f7f82cbeb282d26535a2c1f0af0f02b48025d42c1bd56ac687fba1a3adb706", - "id": "0daff3992b54b1384f52f751c933c727cbaaf4fac435eba88a1817a425753614", - "senderId": "D9rv3h61heDYHQ3b3Xk3V5epHSTTC6Vn1d" - }, - { - "type": 2, - "amount": 0, - "fee": 0, - "recipientId": null, - "senderPublicKey": "0241734825ba45b6de29d6f26242c25ae1ef125b82615ee89a9fdd5b0f3c6b5132", - "timestamp": 0, - "asset": { - "delegate": { - "username": "genesis_28", - "publicKey": "0241734825ba45b6de29d6f26242c25ae1ef125b82615ee89a9fdd5b0f3c6b5132" - } - }, - "signature": "3045022100bb2903424bcd0a72da531470779144d60286191bea1b200c5617ae4f92229ba6022046a876e3e6cb85469a16f34d2f937e2eef787011c6a313ee50258f15116148ac", - "id": "bd17dbd23f8dbba2736688702ac185a87c88c43b24ee6d7764a5b4138b2f38b7", - "senderId": "DAcQPbKa8zBWwDHbxj37N13C61iseMDWM9" - }, - { - "type": 2, - "amount": 0, - "fee": 0, - "recipientId": null, - "senderPublicKey": "03b9409203d7091e3f4d49168529b749e942ed18f21beddd236d57d692f09a8f86", - "timestamp": 0, - "asset": { - "delegate": { - "username": "genesis_29", - "publicKey": "03b9409203d7091e3f4d49168529b749e942ed18f21beddd236d57d692f09a8f86" - } - }, - "signature": "3044022016d7ecfa776930a6f83464548e7a686735fde752903539a38eb9da0ce2488bbd02203c5e23a4072c8de35a90b296145cce3156a31cc0d754b8a37d363fb088bc7387", - "id": "16e02d3ef24dca4b03a1e489e20335224f18d888ed04f7e3512572f8e0cf92ae", - "senderId": "D5mmTaDAMSyPNKiDKrqwTFGWzWrZA3xaF8" - }, - { - "type": 2, - "amount": 0, - "fee": 0, - "recipientId": null, - "senderPublicKey": "02c7b92a2d0027309e21855cf9c42a432b21ad13925e9dfc206f9c01e18fefa08a", - "timestamp": 0, - "asset": { - "delegate": { - "username": "genesis_30", - "publicKey": "02c7b92a2d0027309e21855cf9c42a432b21ad13925e9dfc206f9c01e18fefa08a" - } - }, - "signature": "30450221009de8828a7ad87cb5d52900e09d5beb680f9edc7640a3707d08a379511a7ba0f102202aa1d9294f9631f1325f252adb87c0d866e7398ce410037a42dc861d94308e15", - "id": "fece556bee4de2c7f1bb3099a05a84a33d0c963979fe1a222a899c13b7abb1fc", - "senderId": "DJ3NywAwQh4srbooLH1jTs9ma1hJE79v3z" - }, - { - "type": 2, - "amount": 0, - "fee": 0, - "recipientId": null, - "senderPublicKey": "0221297804a26a93bb441a9d20a2916abf27fa7b29967678ef1a7a58062f73f40d", - "timestamp": 0, - "asset": { - "delegate": { - "username": "genesis_31", - "publicKey": "0221297804a26a93bb441a9d20a2916abf27fa7b29967678ef1a7a58062f73f40d" - } - }, - "signature": "3045022100b969611ef532557fa3da8a0325b2c88f3ebec954d64f158431d86b8e07929ea50220520affdcd0728cb7c5f63a58a1200d44133e90b1f7a6a9e28744ad6b0dcc2a75", - "id": "ee086317ea2fdc522f5eb502a0db9f3d4955b2318559e40a1f22a3f5f8d6344b", - "senderId": "D5P7eti7FUY4Tk5KXoxdf2tDAVQrRVCESA" - }, - { - "type": 2, - "amount": 0, - "fee": 0, - "recipientId": null, - "senderPublicKey": "027f504f6f20648e3bf171952629c7b868a2f799aa4b60f8eb3fe96afff16bbef0", - "timestamp": 0, - "asset": { - "delegate": { - "username": "genesis_32", - "publicKey": "027f504f6f20648e3bf171952629c7b868a2f799aa4b60f8eb3fe96afff16bbef0" - } - }, - "signature": "3044022006be7cbaa74089cabe47d02621f756762587d210a3f211ee941b5fcd0650908f02207d4040408bd25a2de03e5724362735ee8ad36c099b0c16efd4716e1dd7ec62ae", - "id": "764dd21aa4d0e2e0fa17bb2ff5e7ca304995d9e3593542badecc8ed24d5ea3ea", - "senderId": "D9q26yBTrEYuxHg7bbfZphv6129KvLu4v2" - }, - { - "type": 2, - "amount": 0, - "fee": 0, - "recipientId": null, - "senderPublicKey": "031954315b84db8f49ab7ee21357270450bb68d06b34472e5e93ddfa5710edc0c9", - "timestamp": 0, - "asset": { - "delegate": { - "username": "genesis_33", - "publicKey": "031954315b84db8f49ab7ee21357270450bb68d06b34472e5e93ddfa5710edc0c9" - } - }, - "signature": "3045022100859f93df994d86995fdf834bfe86b41eebaa04e5ab7d09f0b37acb50d313cd9802203c8993b793602c96d305fa795a9f2459f4706b340993584f3c56579392c0995c", - "id": "efd9e7c638afe62bec9be61783193ea52eea7b335053bd5af6c758d5b0e5847c", - "senderId": "D9iPFb5kAVnuDdomehRP9LncJj5ng2vrsr" - }, - { - "type": 2, - "amount": 0, - "fee": 0, - "recipientId": null, - "senderPublicKey": "0267b310eac2bb0d6594de382a1ab74ac75b91e9d64a590b6249247b10fd9be829", - "timestamp": 0, - "asset": { - "delegate": { - "username": "genesis_34", - "publicKey": "0267b310eac2bb0d6594de382a1ab74ac75b91e9d64a590b6249247b10fd9be829" - } - }, - "signature": "3045022100a678978ab899e3903e760ee98640e3f658792a096a8d771c575944af6536cfdb0220428c312f1e0eb4be73ce4b256a754447570176200cfb6c09b3eb55f66526dd80", - "id": "70edcce5df67a250b6ba3567879bae6379ce4c688597fcedfbfd0313da6998e8", - "senderId": "D6xZmtyBzZKCEkK29JNPAD581TJ8XXrXYn" - }, - { - "type": 2, - "amount": 0, - "fee": 0, - "recipientId": null, - "senderPublicKey": "028f32320c66a89779756b04946d2aa256dff6cd547349d46e1938710063e387c4", - "timestamp": 0, - "asset": { - "delegate": { - "username": "genesis_35", - "publicKey": "028f32320c66a89779756b04946d2aa256dff6cd547349d46e1938710063e387c4" - } - }, - "signature": "304402206bc95876897527b39eacf4c961f9c036a9c8a0e53a17ce925c592d079fa643030220096e115d7fbd54aca4af7f621d64178dfcf2c13361106a3e3b5025dca97b44ee", - "id": "7f23f44157f3a677e81514fa431227410a27442e5fd1f2491b177c0f580f296d", - "senderId": "D9dW4eXJjABDQXSQB9GtvY5UBuRWWWejWb" - }, - { - "type": 2, - "amount": 0, - "fee": 0, - "recipientId": null, - "senderPublicKey": "0218b889a24988527ab3948d80f97cfc37b923082e1f0398bc162190fd66ec4dee", - "timestamp": 0, - "asset": { - "delegate": { - "username": "genesis_36", - "publicKey": "0218b889a24988527ab3948d80f97cfc37b923082e1f0398bc162190fd66ec4dee" - } - }, - "signature": "3045022100c40a3f4cf15f9274e2b25ca8608cb965316aa0f00fa77817b79620ad8ccbdd5902206203a1043b03ba58aa9b7399694f8215cf45d30eb0caa748cc06f1a85a8faea9", - "id": "a65244ed17a9280aa694abdf6804b1a0b78dfc052b4845abcd3c89380159b29e", - "senderId": "DFHK7SdmPdjxNZ9uweqLZAv6v5GQ1NnBNe" - }, - { - "type": 2, - "amount": 0, - "fee": 0, - "recipientId": null, - "senderPublicKey": "035392ee88c60617764b4fe89ae2cc96560dfa5f992b03be31ce5680db9b863f73", - "timestamp": 0, - "asset": { - "delegate": { - "username": "genesis_37", - "publicKey": "035392ee88c60617764b4fe89ae2cc96560dfa5f992b03be31ce5680db9b863f73" - } - }, - "signature": "3044022036200c3191f8f01b77676644b9b94728b5afb2ab2de8c5c7c5582e795465661c02207848f1f2f0ab378d8906fd45aa048f354d5dbac4cb87c15973ffa86fe84ff0cd", - "id": "219e0942afe5f65c548ec2118a1c49febb7ec03fca4334ac16649062db9d146b", - "senderId": "DSh7AAC9KahXU2JZ539HAqEa5sHafxsxDQ" - }, - { - "type": 2, - "amount": 0, - "fee": 0, - "recipientId": null, - "senderPublicKey": "03e75127d1deccf65844a1761bd26611b6c65c5b51a52eba27e3ee20a539fd63f1", - "timestamp": 0, - "asset": { - "delegate": { - "username": "genesis_38", - "publicKey": "03e75127d1deccf65844a1761bd26611b6c65c5b51a52eba27e3ee20a539fd63f1" - } - }, - "signature": "304402201a2990b2baae72f5cc8f2d1890f328e4082af0cf2a787d8f05208c3424ce089d0220790dbc7606dd6c03568fd0a771e9e8e89557257238ae90cfcb3bb8f3b475987b", - "id": "ee9ad2a66e9b2009a9fc671f80d0493803fc422161140169c7bc1fd401cd9ad6", - "senderId": "D85WuxGZrFs1QUYTvnRpmc6dd8rmBbpnaX" - }, - { - "type": 2, - "amount": 0, - "fee": 0, - "recipientId": null, - "senderPublicKey": "0329fc1580906307ac9f2f55cec66e47983f8287d542408fb19f473a305d3638d8", - "timestamp": 0, - "asset": { - "delegate": { - "username": "genesis_39", - "publicKey": "0329fc1580906307ac9f2f55cec66e47983f8287d542408fb19f473a305d3638d8" - } - }, - "signature": "30450221008f66e89ec4c7af4b77e5b7ff36c542cc02672c8df70806b5a0fab7a7e8c7067502200d99ba19ceb1b471c39c4e95107ad6f8b978a623a790080b16f863347fe06b4f", - "id": "dd3077ed04a76343d340074270ce9826354802bd99e08cb864c1c5ad09f367df", - "senderId": "D85kwsBJKZ4pw5uQpc81eRj95f6a536AP6" - }, - { - "type": 2, - "amount": 0, - "fee": 0, - "recipientId": null, - "senderPublicKey": "035ec848e9388877dac88f121d19c8f5e870ac90d8ccb0116be9f734e4bd1a9405", - "timestamp": 0, - "asset": { - "delegate": { - "username": "genesis_40", - "publicKey": "035ec848e9388877dac88f121d19c8f5e870ac90d8ccb0116be9f734e4bd1a9405" - } - }, - "signature": "304402202b220d6c028bc23213edddaf303f18eef059551891aadbf7a4b4d7d3287457bb0220245678354bb8960b42ba2f2ceb12f926e82ff0d027b44988d799c8c0d8d7d9f2", - "id": "3afc6ea52b8edc7df0230ceac71baf45460f3bd761c5e75fe796bc7415063220", - "senderId": "DGBJdDadBwJD2xY8VsdAykdd6vPakMMUt6" - }, - { - "type": 2, - "amount": 0, - "fee": 0, - "recipientId": null, - "senderPublicKey": "0356f5885306e45402aeb354a74d13c104699b3b53da46a5e922e4a6d6132a67e8", - "timestamp": 0, - "asset": { - "delegate": { - "username": "genesis_41", - "publicKey": "0356f5885306e45402aeb354a74d13c104699b3b53da46a5e922e4a6d6132a67e8" - } - }, - "signature": "3045022100f18bf2e013f2d9dcac013a76037d787f79baaa65f4f31ffe2b4ed8de249bdc8902202abcf77e809599d3e3a96225363c8e760ed4b4e20f97645547b381dba830c3da", - "id": "aea1fc173a2f4a9233b0fe59a5f6804167bee5658cb3e4e19dfe2be20f5772cd", - "senderId": "DG4VbapL3H39NJLB3DqQEefU47EMVqtxVw" - }, - { - "type": 2, - "amount": 0, - "fee": 0, - "recipientId": null, - "senderPublicKey": "03ff8ab980434516ca28c982d0ecc8fc3107116d6c8b3e09c7ee5033f32adbd2ff", - "timestamp": 0, - "asset": { - "delegate": { - "username": "genesis_42", - "publicKey": "03ff8ab980434516ca28c982d0ecc8fc3107116d6c8b3e09c7ee5033f32adbd2ff" - } - }, - "signature": "3045022100e938d9901afeaa5a56d18abd9292ace93be03c84c09a6c4cb58fca96dfb54bc502201e921d27f9886d189f803b14d93655a42c4e095d49ee61051a4e70c7a173f3f1", - "id": "f18426d3ef81d4b7bf0337d70afcecddbd6db2206a2f139f1ca5823c381c7817", - "senderId": "DC3oNWedP48ypGxAeKbFC7gMjWxcNc2JhL" - }, - { - "type": 2, - "amount": 0, - "fee": 0, - "recipientId": null, - "senderPublicKey": "0393f1590771a8ad1cf2baa086858f3029c4444cb82243917a7011f1f66cf8fd05", - "timestamp": 0, - "asset": { - "delegate": { - "username": "genesis_43", - "publicKey": "0393f1590771a8ad1cf2baa086858f3029c4444cb82243917a7011f1f66cf8fd05" - } - }, - "signature": "304502210095745c36a8af07e21546bd064f1ed1bd90e6c2a8db9c0c8e4853d0a8255443db0220259d2ce3677abb42f08b9d22aa13bbe383fd882ed38911b738ebaefc04589694", - "id": "6c51bea35b5e3270dcf7b7dfae8d984e19f476ea7e0435f157c4e0d22b7e7ea1", - "senderId": "DJm2sfcUKhyxakowY9TjyAytkdq7JrFgVj" - }, - { - "type": 2, - "amount": 0, - "fee": 0, - "recipientId": null, - "senderPublicKey": "0234e24ff1dbc447c804eb385cd05bbd1dc59ef03b44a3346b13e7cccf00b61075", - "timestamp": 0, - "asset": { - "delegate": { - "username": "genesis_44", - "publicKey": "0234e24ff1dbc447c804eb385cd05bbd1dc59ef03b44a3346b13e7cccf00b61075" - } - }, - "signature": "3045022100ee1e8df480f2be042386d383d776b3fd6bd2d3f5a9035071153f23dbfdceeaae02203a0834aae4834da3ca7858779d474b9255ead754867d5b4a18873e9ecaa5045e", - "id": "66fb3e36233f4577ba585ccd7daf83e62d8df262d3d832b806479ac67c1ef35d", - "senderId": "D5oS8xfNebiPsjpwPWoZS6sA9qcYjTGT5h" - }, - { - "type": 2, - "amount": 0, - "fee": 0, - "recipientId": null, - "senderPublicKey": "03a5789a4486f20f1fdca78a52b528b3bf9952e7c057de71a22adcfb444ba4c5d3", - "timestamp": 0, - "asset": { - "delegate": { - "username": "genesis_45", - "publicKey": "03a5789a4486f20f1fdca78a52b528b3bf9952e7c057de71a22adcfb444ba4c5d3" - } - }, - "signature": "3045022100cb037530bcff9a4d19899431648747022c28aa3239563379d96692bd525eb38902205f3cabb8dd470d9eb3d425e333ad1bc9f0643d489c600a811748fb5f4a203f7f", - "id": "5df9c5e350136571af4b86697bc9d4cfca3ff8b669e254b36f00be1dbde063f7", - "senderId": "D5SzHHdPdGqYUkH7BGNkmGHEUqfZrWb17r" - }, - { - "type": 2, - "amount": 0, - "fee": 0, - "recipientId": null, - "senderPublicKey": "0347f692345fa7bf90e944eb55246da5f9f595d3f5a20ad50aeb6f9b973aaae17e", - "timestamp": 0, - "asset": { - "delegate": { - "username": "genesis_46", - "publicKey": "0347f692345fa7bf90e944eb55246da5f9f595d3f5a20ad50aeb6f9b973aaae17e" - } - }, - "signature": "3045022100c377efe5ffab58017473699cd7c839dcf48fa5b20b5ddf9bdc4801e22a579b2b02204d35c1a1416069544e3ec01d2ce21bb409f9f2fa4adedc8c03d6417c034a3fec", - "id": "da4cfad78e37d56421dd6676e5618a507340ef1e496831d1968c509e35ef9202", - "senderId": "DCLdibuZB6UsJP8KmdzcDLWzizrDtJQuxt" - }, - { - "type": 2, - "amount": 0, - "fee": 0, - "recipientId": null, - "senderPublicKey": "028a32b441377a69aa76e867026f3109b2f0aef8651fe91e2a4ab01eff102a6b98", - "timestamp": 0, - "asset": { - "delegate": { - "username": "genesis_47", - "publicKey": "028a32b441377a69aa76e867026f3109b2f0aef8651fe91e2a4ab01eff102a6b98" - } - }, - "signature": "3045022100e098672958be15989bb125d9018adb4a54e95ab664e64a673997e617e28b39df02206e8459997074d5976b77f90eb9d7180e9d4a0e0efdf433958ffeb2f04d9de382", - "id": "85bafcd07e7ba47ec95cb5b5a6759d4f9f87e036bb7660c7717504e845ef975e", - "senderId": "DSkivgRyimdAVqmm2ZAKwKmKN39WEbbPnL" - }, - { - "type": 2, - "amount": 0, - "fee": 0, - "recipientId": null, - "senderPublicKey": "0223ac52179903e79865b9a98cf0b52ddc1ab46180c157e8f6bd1e63e7f14fcf31", - "timestamp": 0, - "asset": { - "delegate": { - "username": "genesis_48", - "publicKey": "0223ac52179903e79865b9a98cf0b52ddc1ab46180c157e8f6bd1e63e7f14fcf31" - } - }, - "signature": "304402200a005716f67d6cd3963a3c752c95f1bca01aa127c91ab1a632eb3022d11e3e67022024c4746078e440da441bcb366ee8999ffd2419e9a6f9cbf971d696d5b7f8733b", - "id": "0df1ed07d3f95ddf0385bad83a17b3a8fde6bd6532cd3479e48668064672b34f", - "senderId": "DDgKyKqdA6SuamB1eW77WvFu6RQFMZoU36" - }, - { - "type": 2, - "amount": 0, - "fee": 0, - "recipientId": null, - "senderPublicKey": "039de0390f28c7731d86ae7006a31888f12856cde3cc3c2619d4d4a42b6dfd6c51", - "timestamp": 0, - "asset": { - "delegate": { - "username": "genesis_49", - "publicKey": "039de0390f28c7731d86ae7006a31888f12856cde3cc3c2619d4d4a42b6dfd6c51" - } - }, - "signature": "3045022100efa5d51ca79992be4a87af049b3e9ec1b796576e4d937ea9e3760ab0bdcd301e022027e22a6c3395df155bd399643c241e4cc317eaead1f273fd7a709339dfa9dc99", - "id": "436bebc107fad38e944fd14785e09f0600df4d75d31cf3eac53f850462d0be74", - "senderId": "DKCaoaXApw1xE7K1BJcVkr1KGzjKmFWyTk" - }, - { - "type": 2, - "amount": 0, - "fee": 0, - "recipientId": null, - "senderPublicKey": "02b87b0e70a7ae10613390f405620e24c495ba2b0cfcdbc67688e9b483dea564ee", - "timestamp": 0, - "asset": { - "delegate": { - "username": "genesis_50", - "publicKey": "02b87b0e70a7ae10613390f405620e24c495ba2b0cfcdbc67688e9b483dea564ee" - } - }, - "signature": "304502210096cdd35f803a37730ac73a97a23061dceac96319c67bfb1ddcfbac737febe96102202fa0b279f697da3afc043ffd3ecc838789be07ff119b5527a5c13468cecf66e9", - "id": "bb65f9dbe6272fd07a555fc86762d6a487f538b972f2926ff7698cdc906a32df", - "senderId": "DJQXFKEguZVabsAs46JbXXnQJ5jFhUtN9m" - }, - { - "type": 2, - "amount": 0, - "fee": 0, - "recipientId": null, - "senderPublicKey": "03c9f8f4001216603c152b4b4429c2ead322ac34672999e808d567a7d1140e46be", - "timestamp": 0, - "asset": { - "delegate": { - "username": "genesis_51", - "publicKey": "03c9f8f4001216603c152b4b4429c2ead322ac34672999e808d567a7d1140e46be" - } - }, - "signature": "3045022100ee961089d02d7bb68fe2257f6a972eeaf6e2c1a1ad2f491c417e161fedbb556b02204c834644e5b5cde9a0b3f92fa23bade7670efab0a067597f6c151ee633932706", - "id": "cef44df9684f05dab67c0568a2c5295bb50cbb3c88f5cfbe672365bda274620f", - "senderId": "DKpt7cm2tZk4RPLyQ5ugwEH7gkriRaA7ov" - }, - { - "type": 2, - "amount": 0, - "fee": 0, - "recipientId": null, - "senderPublicKey": "02cf70f73328d490cfb03ee822d3fc0cf9259d67c0564e843491e739501809d657", - "timestamp": 0, - "asset": { - "delegate": { - "username": "genesis_27", - "publicKey": "02cf70f73328d490cfb03ee822d3fc0cf9259d67c0564e843491e739501809d657" - } - }, - "signature": "30440220645b912b60f829c0bce58bfe9890ef9253418b6898416aaead663bdf158a99f2022061abbbabd454ec7f7e3f4b502216eec28110e945a4b9b913b1fc0b9758e7e6e4", - "id": "09408dbcf3e3e0835bf92a05330c023a7d6471f3825301a34efa094e0fd4fc30", - "senderId": "DQfjSqDuKr5YZaLAF8rWpFMqMYwEbPtGKg" - } - ], - "height": 1, - "id": "13149578060728881902", - "blockSignature": "3045022100a6605198e0f590c88798405bc76748d84e280d179bcefed2c993e70cded2a5dd022008c7f915b89fc4f3250fc4b481abb753c68f30ac351871c50bd6cfaf151370e8" -} diff --git a/packages/core-config/__tests__/__stubs__/network/dynamic-fees.json b/packages/core-config/__tests__/__stubs__/network/dynamic-fees.json deleted file mode 100644 index 92af028d5d..0000000000 --- a/packages/core-config/__tests__/__stubs__/network/dynamic-fees.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "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-config/__tests__/__stubs__/network/index.js b/packages/core-config/__tests__/__stubs__/network/index.js deleted file mode 100644 index 9b1b944d73..0000000000 --- a/packages/core-config/__tests__/__stubs__/network/index.js +++ /dev/null @@ -1,5 +0,0 @@ -const dynamicFees = require("./dynamic-fees.json"); -const milestones = require("./milestones.json"); -const network = require("./network.json"); - -module.exports = { dynamicFees, milestones, network }; diff --git a/packages/core-config/__tests__/__stubs__/network/milestones.json b/packages/core-config/__tests__/__stubs__/network/milestones.json deleted file mode 100644 index 51c32313cf..0000000000 --- a/packages/core-config/__tests__/__stubs__/network/milestones.json +++ /dev/null @@ -1,31 +0,0 @@ -[ - { - "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-config/__tests__/__stubs__/network/network.json b/packages/core-config/__tests__/__stubs__/network/network.json deleted file mode 100644 index 0c68bb2a14..0000000000 --- a/packages/core-config/__tests__/__stubs__/network/network.json +++ /dev/null @@ -1,18 +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" - }, - "exceptions": {} -} diff --git a/packages/core-config/__tests__/__stubs__/peers.json b/packages/core-config/__tests__/__stubs__/peers.json deleted file mode 100644 index e212ecdd33..0000000000 --- a/packages/core-config/__tests__/__stubs__/peers.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "list": [ - { - "ip": "127.0.0.1", - "port": 4102 - }, - { - "ip": "127.0.0.1", - "port": 4202 - } - ] -} diff --git a/packages/core-config/__tests__/loaders/file-loader.test.ts b/packages/core-config/__tests__/loaders/file-loader.test.ts deleted file mode 100644 index fce016bbc5..0000000000 --- a/packages/core-config/__tests__/loaders/file-loader.test.ts +++ /dev/null @@ -1,44 +0,0 @@ -import "jest-extended"; - -import { resolve } from "path"; -import { FileLoader } from "../../src/loaders"; - -const stubConfigPath = resolve(__dirname, "../__stubs__"); - -const stubConfig = { - delegates: require(resolve(__dirname, "../__stubs__/delegates")), - genesisBlock: require(resolve(__dirname, "../__stubs__/genesisBlock")), - network: require(resolve(__dirname, "../__stubs__/network")), -}; - -let loader; -beforeEach(() => { - loader = new FileLoader(); - 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).toContainAllKeys([ - ...Object.keys(stubConfig.network.network), - ...["milestones", "dynamicFees"], - ]); - }); -}); diff --git a/packages/core-config/__tests__/loaders/remote-loader.test.ts b/packages/core-config/__tests__/loaders/remote-loader.test.ts deleted file mode 100644 index 31337020a1..0000000000 --- a/packages/core-config/__tests__/loaders/remote-loader.test.ts +++ /dev/null @@ -1,139 +0,0 @@ -import "jest-extended"; - -import { existsSync, pathExistsSync, removeSync } from "fs-extra"; -import * as mockProcess from "jest-mock-process"; - -import axios from "axios"; -import MockAdapter from "axios-mock-adapter"; -import { RemoteLoader } from "../../src/loaders"; - -const axiosMock = new MockAdapter(axios); -const configDir = "./__test-remote-config__"; - -let testSubject; - -afterAll(() => { - removeSync(configDir); -}); - -beforeEach(() => { - testSubject = new RemoteLoader({ - remote: "127.0.0.1:4002", - config: configDir, - data: "./data", - }); -}); - -afterEach(() => { - axiosMock.reset(); -}); - -describe.skip("Remote Loader", () => { - it("should ensure the config directory exists", () => { - expect(pathExistsSync(testSubject.config)).toBeTrue(); - }); - - describe("__configureNetwork", () => { - it("should not be OK", async () => { - const mockExit = mockProcess.mockProcessExit(); - - axiosMock.onGet("http://127.0.0.1:4002/config/network").reply(() => [404, {}]); - - await testSubject.__configureNetwork(); - - expect(mockExit).toHaveBeenCalledWith(1); - }); - - it("should be OK", async () => { - axiosMock.onGet("http://127.0.0.1:4002/config/network").reply(() => [ - 200, - { - data: require("../../crypto/src/networks/ark/devnet.json"), - }, - ]); - - await testSubject.__configureNetwork(); - - expect(existsSync(`${configDir}/network.json`)).toBeTrue(); - }); - }); - - describe("__configureGenesisBlock", () => { - it("should not be OK", async () => { - axiosMock.onGet("http://127.0.0.1:4002/config/genesis-block").reply(() => [404, {}]); - - await expect(testSubject.__configureGenesisBlock()).rejects.toThrowError(); - }); - - it("should be OK", async () => { - axiosMock.onGet("http://127.0.0.1:4002/config/genesis-block").reply(() => [ - 200, - { - data: require("../../core/src/config/devnet/genesisBlock.json"), - }, - ]); - - await testSubject.__configureGenesisBlock(); - - expect(existsSync(`${configDir}/genesisBlock.json`)).toBeTrue(); - }); - }); - - describe("__configurePeers", () => { - it("should not be OK", async () => { - const mockExit = mockProcess.mockProcessExit(); - - axiosMock.onGet("http://127.0.0.1:4002/config/peers").reply(() => [404, {}]); - - await testSubject.__configurePeers(); - - expect(mockExit).toHaveBeenCalledWith(1); - }); - - it("should be OK", async () => { - axiosMock.onGet("http://127.0.0.1:4002/config/peers").reply(() => [ - 200, - { - data: require("../../core/src/config/devnet/peers.json"), - }, - ]); - - await testSubject.__configurePeers(); - - expect(existsSync(`${configDir}/peers.json`)).toBeTrue(); - }); - }); - - describe("__configureDelegates", () => { - it("should not be OK", async () => { - const mockExit = mockProcess.mockProcessExit(); - - axiosMock.onGet("http://127.0.0.1:4002/config/delegates").reply(() => [404, {}]); - - await testSubject.__configureDelegates(); - - expect(mockExit).toHaveBeenCalledWith(1); - }); - - it("should be OK", async () => { - axiosMock.onGet("http://127.0.0.1:4002/config/delegates").reply(() => [ - 200, - { - data: require("../../core/src/config/devnet/delegates.json"), - }, - ]); - - await testSubject.__configureDelegates(); - - expect(existsSync(`${configDir}/delegates.json`)).toBeTrue(); - }); - }); - - describe("__configurePlugins", () => { - it("should be OK", async () => { - await testSubject.__configurePlugins({ name: "devnet" }); - - expect(existsSync(`${configDir}/plugins.js`)).toBeTrue(); - }); - }); -}); diff --git a/packages/core-config/package.json b/packages/core-config/package.json deleted file mode 100644 index 5c52d5c89a..0000000000 --- a/packages/core-config/package.json +++ /dev/null @@ -1,50 +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", - "@types/joi": "^14.0.1", - "@types/lodash.get": "^4.4.4", - "@types/lodash.set": "^4.3.4", - "axios": "^0.18.0", - "fs-extra": "^7.0.1", - "joi": "^14.3.0", - "lodash.get": "^4.4.2", - "lodash.set": "^4.3.2" - }, - "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 929268fcb5..0000000000 --- a/packages/core-config/src/index.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { FileLoader, RemoteLoader } from "./loaders"; - -export const plugin = { - pkg: require("../package.json"), - alias: "config", - async register(container, options) { - const variables = container.variables; - - // Check if we need to retrieve remote configuration files! - if (variables.remote) { - const remoteLoader = new RemoteLoader(variables); - await remoteLoader.setUp(); - } - - // Load the local configuration files - const loader = new FileLoader(); - await loader.setUp(options); - - return loader; - }, -}; diff --git a/packages/core-config/src/loaders/file-loader.ts b/packages/core-config/src/loaders/file-loader.ts deleted file mode 100644 index 5929d9f94f..0000000000 --- a/packages/core-config/src/loaders/file-loader.ts +++ /dev/null @@ -1,146 +0,0 @@ -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 { schema } from "../schema"; - -export class FileLoader { - public network: any; - public peers: any; - public delegates: any; - public genesisBlock: any; - public milestones: any; - public dynamicFees: any; - - private options: any; - - /** - * Make the config instance. - * @param {Object} options - * @return {Loader} - */ - public async setUp(options: object = {}): Promise { - this.options = options; - - try { - const { value, error } = Joi.validate(JSON.parse(process.env.ARK_NETWORK), schema); - - if (error) { - throw error; - } - - await this.createFromDirectory(); - - configManager.setConfig(value); - - // TODO: change once the config object has been implemented - this.network = configManager.all(); - this.milestones = configManager.get("milestones"); - this.dynamicFees = configManager.get("dynamicFees"); - } catch (error) { - console.error(error.message); - process.exit(1); - } - } - - public get(key: string, defaultValue: any = null): any { - // TODO: change to a config object that holds all values - return get(this.network, key, defaultValue); - } - - public set(key: string, value: any): void { - // TODO: change to a config object that holds all values - set(this.network, key, value); - } - - /** - * Get constants for the specified height. - * @param {Number} height - * @return {void} - */ - public getMilestone(height: number): void { - return configManager.getMilestone(height); - } - - /** - * Load and bind the config. - * @return {void} - */ - private 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} - */ - private createBindings(files: Record): void { - for (const [key, value] of Object.entries(files)) { - this[key] = require(value); - } - } - - /** - * 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: 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) { - // - } - } - } - } -} diff --git a/packages/core-config/src/loaders/index.ts b/packages/core-config/src/loaders/index.ts deleted file mode 100644 index 6d1ff138aa..0000000000 --- a/packages/core-config/src/loaders/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { FileLoader } from "./file-loader"; -import { RemoteLoader } from "./remote-loader"; - -export { FileLoader, RemoteLoader }; diff --git a/packages/core-config/src/loaders/remote-loader.ts b/packages/core-config/src/loaders/remote-loader.ts deleted file mode 100644 index 60e5ad2891..0000000000 --- a/packages/core-config/src/loaders/remote-loader.ts +++ /dev/null @@ -1,120 +0,0 @@ -import { models } from "@arkecosystem/crypto"; -import axios from "axios"; -import { spawnSync } from "child_process"; -import expandHomeDir from "expand-home-dir"; -import { copySync, ensureDirSync, existsSync, writeFileSync } from "fs-extra"; -import { resolve } from "path"; - -export class RemoteLoader { - private remote: any; - private config: any; - - constructor(variables) { - this.remote = variables.remote; - this.config = expandHomeDir(variables.config); - - ensureDirSync(this.config); - } - - public async setUp() { - const network = await this.configureNetwork(); - - await this.configureMilestones(); - - await this.configureGenesisBlock(); - - await this.configurePeers(); - - await this.configureDelegates(); - - this.configurePlugins(network); - - this.configureDatabase(network); - } - - private async configureNetwork() { - const network = await this.getConfig("network"); - - this.writeConfig("network", network); - - return network; - } - - 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 genesisBlockModel = new Block(genesisBlock); - - if (!genesisBlockModel.verification.verified) { - // tslint:disable-next-line:no-console - console.error("Failed to verify the genesis block. Try another remote host."); - process.exit(1); - } - - this.writeConfig("genesisBlock", genesisBlock); - } - - private async configurePeers() { - const peers = await this.getConfig("peers"); - - this.writeConfig("peers", peers); - } - - private async configureDelegates() { - const delegates = await this.getConfig("delegates"); - - this.writeConfig("delegates", delegates); - } - - private configurePlugins(network) { - const plugins = resolve(__dirname, `../../core/src/config/${network.name}/plugins.js`); - - copySync(plugins, `${this.config}/plugins.js`); - } - - private configureDatabase(network) { - const command = spawnSync("createdb", [`ark_${network.name}`]); - - if (command.stderr.length > 0) { - // tslint:disable-next-line:no-console - console.error(command.stderr.toString()); - process.exit(1); - } - - // tslint:disable-next-line:no-console - console.info(command.stdout.toString()); - } - - private async getConfig(type) { - try { - const { data } = await axios.get(`http://${this.remote}/config/${type}`, { - headers: { "Content-Type": "application/json" }, - }); - - return data.data; - } catch (error) { - if (!this.exists(type)) { - // tslint:disable-next-line:no-console - console.error(error.message); - process.exit(1); - } - } - } - - private writeConfig(file, data) { - writeFileSync(`${this.config}/${file}.json`, JSON.stringify(data, null, 4)); - } - - private exists(file) { - return existsSync(`${this.config}/${file}.json`); - } -} diff --git a/packages/core-config/src/schema.ts b/packages/core-config/src/schema.ts deleted file mode 100644 index db80d712e7..0000000000 --- a/packages/core-config/src/schema.ts +++ /dev/null @@ -1,86 +0,0 @@ -import Joi from "joi"; - -export const schema = Joi.object({ - delegates: Joi.object({ - secrets: Joi.array().items(Joi.string()), - bip38: Joi.string(), - }), - dynamicFees: Joi.object({ - enabled: Joi.boolean().required(), - minFeePool: Joi.number() - .integer() - .positive() - .required(), - minFeeBroadcast: Joi.number() - .integer() - .positive() - .required(), - addonBytes: Joi.object() - .keys({ - transfer: Joi.number() - .integer() - .required(), - secondSignature: Joi.number() - .integer() - .required(), - delegateRegistration: Joi.number() - .integer() - .required(), - vote: Joi.number() - .integer() - .required(), - multiSignature: Joi.number() - .integer() - .required(), - ipfs: Joi.number() - .integer() - .required(), - timelockTransfer: Joi.number() - .integer() - .required(), - multiPayment: Joi.number() - .integer() - .required(), - delegateResignation: Joi.number() - .integer() - .required(), - }) - .required(), - }).required(), - milestones: Joi.array() - .items(Joi.object()) - .required(), - 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(), - }), - exceptions: Joi.object({ - blocks: Joi.array().items(Joi.string()), - transactions: Joi.array().items(Joi.string()), - }).required(), - outlookTable: Joi.object(), - transactionIdFixTable: Joi.object(), - }).required(), -}); 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/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/container.ts b/packages/core-container/src/container.ts index 6f5a3a99f2..471a12f052 100644 --- a/packages/core-container/src/container.ts +++ b/packages/core-container/src/container.ts @@ -2,6 +2,7 @@ import { createContainer } from "awilix"; import { execSync } from "child_process"; import delay from "delay"; import semver from "semver"; +import { Config } from "./config"; import { Environment } from "./environment"; import { PluginRegistrar } from "./registrars/plugin"; @@ -16,6 +17,7 @@ export class Container { public version: string; public isReady: boolean = false; public variables: any; + public config: any; /** * Create a new container instance. @@ -70,6 +72,9 @@ export class Container { return; } + // Setup the configuration + this.config = await Config.setUp(variables, options); + // TODO: Move this out eventually - not really the responsibility of the container this.plugins = new PluginRegistrar(this, options); await this.plugins.setUp(); @@ -77,6 +82,10 @@ export class Container { this.isReady = true; } + public getConfig() { + return this.config; + } + /** * Tear down the app. * @return {Promise} diff --git a/packages/core-container/src/environment.ts b/packages/core-container/src/environment.ts index 353adc1104..2e8074897e 100644 --- a/packages/core-container/src/environment.ts +++ b/packages/core-container/src/environment.ts @@ -16,7 +16,6 @@ export class Environment { */ public setUp() { this.exportPaths(); - this.exportNetwork(); this.exportVariables(); } @@ -34,35 +33,6 @@ export class Environment { } } - /** - * Export all network variables for the core environment. - * @return {void} - */ - private 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`)); - - 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.env.ARK_NETWORK = JSON.stringify(config); - process.env.ARK_NETWORK_NAME = config.network.name; - } - /** * Export all additional variables for the core environment. * @return {void} diff --git a/packages/core-database-postgres/src/spv.ts b/packages/core-database-postgres/src/spv.ts index 50bd4a8a0d..f17c93067d 100644 --- a/packages/core-database-postgres/src/spv.ts +++ b/packages/core-database-postgres/src/spv.ts @@ -5,7 +5,7 @@ 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); diff --git a/packages/core-database/src/interface.ts b/packages/core-database/src/interface.ts index 25802b2797..0708f51dcf 100644 --- a/packages/core-database/src/interface.ts +++ b/packages/core-database/src/interface.ts @@ -31,7 +31,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"); diff --git a/packages/core-database/src/wallet-manager.ts b/packages/core-database/src/wallet-manager.ts index 5178ac1f76..9e6d7ee995 100644 --- a/packages/core-database/src/wallet-manager.ts +++ b/packages/core-database/src/wallet-manager.ts @@ -20,7 +20,7 @@ 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; diff --git a/packages/core-forger/src/client.ts b/packages/core-forger/src/client.ts index ad02267bb5..465e0321d3 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().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 1a03a31b00..1b09a37e80 100644 --- a/packages/core-forger/src/manager.ts +++ b/packages/core-forger/src/manager.ts @@ -26,7 +26,7 @@ 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; diff --git a/packages/core-json-rpc/src/server/services/network.ts b/packages/core-json-rpc/src/server/services/network.ts index aec2b938f5..81fcacc514 100644 --- a/packages/core-json-rpc/src/server/services/network.ts +++ b/packages/core-json-rpc/src/server/services/network.ts @@ -15,7 +15,7 @@ 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 = configManager.get("name"); diff --git a/packages/core-p2p/src/court/guard.ts b/packages/core-p2p/src/court/guard.ts index ce1b075e67..d608d9d68c 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 { diff --git a/packages/core-p2p/src/monitor.ts b/packages/core-p2p/src/monitor.ts index 745cd40a5e..ed46054a22 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"); diff --git a/packages/core-p2p/src/peer.ts b/packages/core-p2p/src/peer.ts index e5d829c8ad..18895400a7 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}`; diff --git a/packages/core-p2p/src/server/plugins/set-headers.ts b/packages/core-p2p/src/server/plugins/set-headers.ts index b6701be1bb..1828865fec 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. diff --git a/packages/core-p2p/src/server/versions/1/handlers.ts b/packages/core-p2p/src/server/versions/1/handlers.ts index d83297f26a..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"); /** 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..3c452364db 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) { 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 983cd8f6f8..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} 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 321860027b..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; /** 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 4e48a1a9dc..ad3db68604 100644 --- a/packages/core-snapshots/src/db/index.ts +++ b/packages/core-snapshots/src/db/index.ts @@ -67,7 +67,7 @@ class Database { } public async rollbackChain(height) { - const config = app.resolvePlugin("config"); + const config = app.getConfig(); const maxDelegates = config.getMilestone(height).activeDelegates; const currentRound = Math.floor(height / maxDelegates); const lastBlockHeight = currentRound * maxDelegates; diff --git a/packages/core-snapshots/src/manager.ts b/packages/core-snapshots/src/manager.ts index ec432d26af..c631ee5bdf 100644 --- a/packages/core-snapshots/src/manager.ts +++ b/packages/core-snapshots/src/manager.ts @@ -79,7 +79,7 @@ export class SnapshotManager { public async rollbackChain(height) { const lastBlock = await this.database.getLastBlock(); - const config = app.resolvePlugin("config"); + const config = app.getConfig(); const maxDelegates = config.getMilestone(lastBlock.height).activeDelegates; const rollBackHeight = height === -1 ? lastBlock.height : height; diff --git a/packages/core-test-utils/src/config/testnet/plugins.js b/packages/core-test-utils/src/config/testnet/plugins.js index 317d04d7e3..1c00be0cc4 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: { diff --git a/packages/core-transaction-pool/__tests__/connection.test.ts b/packages/core-transaction-pool/__tests__/connection.test.ts index 6d77092a5f..ca3e4a7d42 100644 --- a/packages/core-transaction-pool/__tests__/connection.test.ts +++ b/packages/core-transaction-pool/__tests__/connection.test.ts @@ -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"); diff --git a/packages/core-utils/__tests__/supply-calculator.test.ts b/packages/core-utils/__tests__/supply-calculator.test.ts index f3b1ca9d8c..139f281dad 100644 --- a/packages/core-utils/__tests__/supply-calculator.test.ts +++ b/packages/core-utils/__tests__/supply-calculator.test.ts @@ -30,7 +30,7 @@ app.resolvePlugin = jest.fn(plugin => { }); beforeAll(() => { - config = app.resolvePlugin("config"); + config = app.getConfig(); }); describe("Supply calculator", () => { diff --git a/packages/core-utils/src/delegate-calculator.ts b/packages/core-utils/src/delegate-calculator.ts index 9ea8ec86d4..c59b264cf7 100644 --- a/packages/core-utils/src/delegate-calculator.ts +++ b/packages/core-utils/src/delegate-calculator.ts @@ -10,7 +10,7 @@ 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; diff --git a/packages/core-utils/src/format-timestamp.ts b/packages/core-utils/src/format-timestamp.ts index 5cb75121ec..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").getMilestone(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 c25871f41d..0ef1b6694c 100644 --- a/packages/core-utils/src/round-calculator.ts +++ b/packages/core-utils/src/round-calculator.ts @@ -7,7 +7,7 @@ import { app } from "@arkecosystem/core-container"; * @return {Object} */ function calculateRound(height, maxDelegates: any = null) { - const config = app.resolvePlugin("config"); + const config = app.getConfig(); maxDelegates = maxDelegates || config.getMilestone(height).activeDelegates; const round = Math.floor((height - 1) / maxDelegates) + 1; @@ -22,7 +22,7 @@ function calculateRound(height, maxDelegates: any = null) { * @return {boolean} true if new round, false if not */ function isNewRound(height) { - const config = app.resolvePlugin("config"); + 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 7240794eb6..f09698c043 100644 --- a/packages/core-utils/src/supply-calculator.ts +++ b/packages/core-utils/src/supply-calculator.ts @@ -7,7 +7,7 @@ import { Bignum, configManager } from "@arkecosystem/crypto"; * @return {Number} */ function calculate(height) { - const { genesisBlock, milestones } = app.resolvePlugin("config"); + const { genesisBlock, milestones } = app.getConfig(); if (!height) { const blockchain = app.resolvePlugin("blockchain"); diff --git a/packages/core-vote-report/src/handler.ts b/packages/core-vote-report/src/handler.ts index 639be6e471..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"); 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/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 2f82e716ef..9029283716 100644 --- a/packages/core/src/commands/index.ts +++ b/packages/core/src/commands/index.ts @@ -20,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", 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: { From f44b438917b9a0364cec104d46115da78e59d7fd Mon Sep 17 00:00:00 2001 From: Brian Faust Date: Sun, 16 Dec 2018 15:15:59 +0200 Subject: [PATCH 34/63] test(core-utils): adjust config mocks to core-container --- .../mocks/core-container-calculator.ts | 11 +++++++++++ .../__support__/mocks/core-container.ts | 18 +++++++----------- .../__tests__/supply-calculator.test.ts | 6 ++---- 3 files changed, 20 insertions(+), 15 deletions(-) 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 8a1b4a4020..98b1957d58 100644 --- a/packages/core-utils/__tests__/__support__/mocks/core-container-calculator.ts +++ b/packages/core-utils/__tests__/__support__/mocks/core-container-calculator.ts @@ -1,6 +1,17 @@ jest.mock("@arkecosystem/core-container", () => { return { app: { + getConfig: () => { + return { + getMilestone: () => ({ + height: 1, + reward: 2 * 1e8, + }), + genesisBlock: { + totalAmount: 1000000 * 1e8, + }, + }; + }, resolvePlugin: name => { if (name === "config") { return { diff --git a/packages/core-utils/__tests__/__support__/mocks/core-container.ts b/packages/core-utils/__tests__/__support__/mocks/core-container.ts index fd0c6cdab9..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 { - getMilestone: () => ({ - 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__/supply-calculator.test.ts b/packages/core-utils/__tests__/supply-calculator.test.ts index 139f281dad..c15909869f 100644 --- a/packages/core-utils/__tests__/supply-calculator.test.ts +++ b/packages/core-utils/__tests__/supply-calculator.test.ts @@ -9,11 +9,9 @@ const mockConfig = { milestones: [{ height: 1, reward: 2 }], }; -app.resolvePlugin = jest.fn(plugin => { - if (plugin === "config") { - return mockConfig; - } +app.getConfig = jest.fn(() => mockConfig); +app.resolvePlugin = jest.fn(plugin => { if (plugin === "blockchain") { return { getLastBlock: () => { From e18453aa46fbef65fb65869f6e963cc032584dfa Mon Sep 17 00:00:00 2001 From: Brian Faust Date: Sun, 16 Dec 2018 15:42:30 +0200 Subject: [PATCH 35/63] fix: bad method calls --- packages/core-api/__tests__/v1/handlers/blocks.test.ts | 2 +- packages/core-blockchain/__tests__/blockchain.test.ts | 2 +- packages/core-json-rpc/src/server/services/network.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/core-api/__tests__/v1/handlers/blocks.test.ts b/packages/core-api/__tests__/v1/handlers/blocks.test.ts index 53f6e9f95b..d4cb76edbe 100644 --- a/packages/core-api/__tests__/v1/handlers/blocks.test.ts +++ b/packages/core-api/__tests__/v1/handlers/blocks.test.ts @@ -76,7 +76,7 @@ describe("API 1.0 - Blocks", () => { expect(response.data.nethash).toBeString(); const { app: container } = require("@arkecosystem/core-container"); - const config = container.resolvePlugin("config"); + const config = container.getConfig(); expect(response.data.nethash).toBe(config.network.nethash); }); diff --git a/packages/core-blockchain/__tests__/blockchain.test.ts b/packages/core-blockchain/__tests__/blockchain.test.ts index 8255e08bf2..0c22f427f3 100644 --- a/packages/core-blockchain/__tests__/blockchain.test.ts +++ b/packages/core-blockchain/__tests__/blockchain.test.ts @@ -38,7 +38,7 @@ 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. diff --git a/packages/core-json-rpc/src/server/services/network.ts b/packages/core-json-rpc/src/server/services/network.ts index 81fcacc514..bf3dba3ac4 100644 --- a/packages/core-json-rpc/src/server/services/network.ts +++ b/packages/core-json-rpc/src/server/services/network.ts @@ -18,7 +18,7 @@ class Network { this.config = app.getConfig(); this.p2p = app.resolvePlugin("p2p"); - this.network = configManager.get("name"); + this.network = configManager.all(); this.__loadRemotePeers(); From 68a1d8043c1845aaf6abf26cd1c03b24172266e1 Mon Sep 17 00:00:00 2001 From: Brian Faust Date: Sun, 16 Dec 2018 15:48:45 +0200 Subject: [PATCH 36/63] chore: add missing files --- .../__tests__/v1/handlers/blocks.test.ts | 4 +- packages/core-container/.gitignore | 1 - .../__tests__/__stubs__/config/delegates.json | 3 + .../__stubs__/config/genesisBlock.json | 896 ++++++++++++++++++ .../config/network/dynamic-fees.json | 16 + .../__stubs__/config/network/index.js | 5 + .../__stubs__/config/network/milestones.json | 31 + .../__stubs__/config/network/network.json | 18 + .../__tests__/__stubs__/config/peers.json | 12 + .../config/loaders/file-loader.test.ts | 41 + .../config/loaders/remote-loader.test.ts | 139 +++ packages/core-container/src/config/index.ts | 22 + .../src/config/loaders/file-loader.ts | 147 +++ .../src/config/loaders/index.ts | 4 + .../src/config/loaders/remote-loader.ts | 120 +++ packages/core-container/src/config/network.ts | 35 + packages/core-container/src/config/schema.ts | 87 ++ 17 files changed, 1578 insertions(+), 3 deletions(-) create mode 100644 packages/core-container/__tests__/__stubs__/config/delegates.json create mode 100644 packages/core-container/__tests__/__stubs__/config/genesisBlock.json create mode 100644 packages/core-container/__tests__/__stubs__/config/network/dynamic-fees.json create mode 100644 packages/core-container/__tests__/__stubs__/config/network/index.js create mode 100644 packages/core-container/__tests__/__stubs__/config/network/milestones.json create mode 100644 packages/core-container/__tests__/__stubs__/config/network/network.json create mode 100644 packages/core-container/__tests__/__stubs__/config/peers.json create mode 100644 packages/core-container/__tests__/config/loaders/file-loader.test.ts create mode 100644 packages/core-container/__tests__/config/loaders/remote-loader.test.ts create mode 100644 packages/core-container/src/config/index.ts create mode 100644 packages/core-container/src/config/loaders/file-loader.ts create mode 100644 packages/core-container/src/config/loaders/index.ts create mode 100644 packages/core-container/src/config/loaders/remote-loader.ts create mode 100644 packages/core-container/src/config/network.ts create mode 100644 packages/core-container/src/config/schema.ts diff --git a/packages/core-api/__tests__/v1/handlers/blocks.test.ts b/packages/core-api/__tests__/v1/handlers/blocks.test.ts index d4cb76edbe..bd4d17060e 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,8 +76,7 @@ describe("API 1.0 - Blocks", () => { expect(response.data.nethash).toBeString(); - const { app: container } = require("@arkecosystem/core-container"); - const config = container.getConfig(); + const config = app.getConfig(); expect(response.data.nethash).toBe(config.network.nethash); }); 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-container/__tests__/__stubs__/config/delegates.json b/packages/core-container/__tests__/__stubs__/config/delegates.json new file mode 100644 index 0000000000..cb2b4899cd --- /dev/null +++ b/packages/core-container/__tests__/__stubs__/config/delegates.json @@ -0,0 +1,3 @@ +{ + "secrets": ["this is a test"] +} diff --git a/packages/core-container/__tests__/__stubs__/config/genesisBlock.json b/packages/core-container/__tests__/__stubs__/config/genesisBlock.json new file mode 100644 index 0000000000..83801fa8e0 --- /dev/null +++ b/packages/core-container/__tests__/__stubs__/config/genesisBlock.json @@ -0,0 +1,896 @@ +{ + "version": 0, + "totalAmount": 12500000000000000, + "totalFee": 0, + "reward": 0, + "payloadHash": "578e820911f24e039733b45e4882b73e301f813a0d2c31330dafda84534ffa23", + "timestamp": 0, + "numberOfTransactions": 52, + "payloadLength": 11401, + "previousBlock": null, + "generatorPublicKey": "024c8247388a02ecd1de2a3e3fd5b7c61ecc2797fa3776599d558333ef1802d231", + "transactions": [ + { + "type": 0, + "amount": 12500000000000000, + "fee": 0, + "recipientId": "DGihocTkwDygiFvmg6aG8jThYTic47GzU9", + "timestamp": 0, + "asset": {}, + "senderPublicKey": "03cb7bca143376721d0e9e3f3ccb0dc2e7e8470c06e630c3cef73f03e309b558ad", + "signature": "3044022016ecdf3039e69514c7d75861b22fc076496b61c07a1fcf793dc4f5c76fa0532b0220579c4c0c9d13720f9db5d9df29ed8ceab0adc266c6c160d612d4894dc5867eb1", + "id": "e40ce11cab82736da1cc91191716f3c1f446ca7b6a9f4f93b7120ef105ba06e8", + "senderId": "DUFeXjJmYt1mWY3auywA1EQSqfCv5kYYfP" + }, + { + "type": 2, + "amount": 0, + "fee": 0, + "recipientId": null, + "senderPublicKey": "03e5b39a83e6c7c952c5908089d4524bb8dda93acc2b2b953247e43dc4fe9aa3d1", + "timestamp": 0, + "asset": { + "delegate": { + "username": "genesis_1", + "publicKey": "03e5b39a83e6c7c952c5908089d4524bb8dda93acc2b2b953247e43dc4fe9aa3d1" + } + }, + "signature": "3045022100e3e38811778023e6f17fefd447f179d45ab92c398c7cfb1e34e2f6e1b167c95a022070c36439ecec0fc3c43850070f29515910435d389e059579878d61b5ff2ea337", + "id": "eb0146ac79afc228f0474a5ae1c4771970ae7880450b998c401029f522cd8a21", + "senderId": "DNL81CT6WNG1PHjobBmLvKwLV3UUscBymB" + }, + { + "type": 2, + "amount": 0, + "fee": 0, + "recipientId": null, + "senderPublicKey": "031137050d5fed0b5229b150257da2ac9c135efdf4bcb382b0ad0c197d7be458f4", + "timestamp": 0, + "asset": { + "delegate": { + "username": "genesis_3", + "publicKey": "031137050d5fed0b5229b150257da2ac9c135efdf4bcb382b0ad0c197d7be458f4" + } + }, + "signature": "30440220124baaa04491287d0abbf5a167c9b0f5ac95c22b196f42ff3d275cc9a213c2fd02206e6ebada85f67063e642dbcde6b956f8c99c05f4b9c55f1551d3eebba6375043", + "id": "c9c554056b3428951633a7059dd64dfcbd776fef7f4a156ea362b37ee6ce74c7", + "senderId": "DG9LYv5rqX67wuGvGVa9is5k1r86LKCVTA" + }, + { + "type": 2, + "amount": 0, + "fee": 0, + "recipientId": null, + "senderPublicKey": "037def83d085778d7767a182a179f345207953441089081f5bc13f86d3891308aa", + "timestamp": 0, + "asset": { + "delegate": { + "username": "genesis_4", + "publicKey": "037def83d085778d7767a182a179f345207953441089081f5bc13f86d3891308aa" + } + }, + "signature": "3045022100900cea3c2df393414899c9d74db57d89c9f311c70d08b974d0fd4a98bfae2fc902204a2aa51a1ec71da27c26afc033de6bd2d15978813c120c95e1a4dafca75ce876", + "id": "c82ccaa16be0e3c7ff4a53e2807968b71a0d88115223c3af2eb320f32449ac32", + "senderId": "DMSwarrHg5N9ZAZ6nsqPuUjyAU6gdRAM9d" + }, + { + "type": 2, + "amount": 0, + "fee": 0, + "recipientId": null, + "senderPublicKey": "033f28ad2e9b897d46f1e67c7c52070e9ca46b04c0679ebb21fb236719e38aade3", + "timestamp": 0, + "asset": { + "delegate": { + "username": "genesis_5", + "publicKey": "033f28ad2e9b897d46f1e67c7c52070e9ca46b04c0679ebb21fb236719e38aade3" + } + }, + "signature": "30440220285188d8900cd3cffccf5e1de305b18856451dd04d2ed21165dffe9a7ce4afc1022009457be6bfe536971697105d47ad1f829738a5cacdb27a23c5d1e8a8dddf3ebd", + "id": "ee6a19fff622ab4e6e96d159396de56d6034b4b18a9cf5c99efcf4e61b28e15a", + "senderId": "DFcYHfCwhGWcBNy6cp48wy5SfXbQmfBYgT" + }, + { + "type": 2, + "amount": 0, + "fee": 0, + "recipientId": null, + "senderPublicKey": "023e577a7b3362e0aba70e6911d230e86d729b4cb640f0e0b25637b812a3e38b53", + "timestamp": 0, + "asset": { + "delegate": { + "username": "genesis_6", + "publicKey": "023e577a7b3362e0aba70e6911d230e86d729b4cb640f0e0b25637b812a3e38b53" + } + }, + "signature": "3045022100afa56542dd473c424b36d4d9f24da68180cfd90527681ab84098f415b2544a8702201e8ebdd619a2dd200e37a57c39a4529afe76d35f6089c00f6dffba6bf7b8a836", + "id": "0dcd6e380bd7eaef8724f64f4b86104ce7497308dacf775afbe6ec0d401007fe", + "senderId": "D5e2FzTPqdEHridjzpFZCCVyepAu6Vpmk4" + }, + { + "type": 2, + "amount": 0, + "fee": 0, + "recipientId": null, + "senderPublicKey": "02af5e6341efc14f4ba39a9ff65e151cc7304fc742ce7b2678d9aa446c555ee9c1", + "timestamp": 0, + "asset": { + "delegate": { + "username": "genesis_7", + "publicKey": "02af5e6341efc14f4ba39a9ff65e151cc7304fc742ce7b2678d9aa446c555ee9c1" + } + }, + "signature": "3045022100c8980155c8f8964d76baf3e8d690075708f1a84757c1de52e311772466382da2022012599acfc7839fa1ef6bbd445ab34555fb718491db3089f40d4842b1bc2d3178", + "id": "8af6abb117c69c130e388970d595b741374b1bbca709d9e91459e9e3c721397b", + "senderId": "DDLbnve6XK48cGsQiFhesUJQRQdKkZTfPh" + }, + { + "type": 2, + "amount": 0, + "fee": 0, + "recipientId": null, + "senderPublicKey": "02845161cfca4d6ddde8e0d53538b6f881fb3ad9383cd77cebc55375dd6fd17663", + "timestamp": 0, + "asset": { + "delegate": { + "username": "genesis_8", + "publicKey": "02845161cfca4d6ddde8e0d53538b6f881fb3ad9383cd77cebc55375dd6fd17663" + } + }, + "signature": "30450221009bce7c5c10a4b6306cebe5724adfd3de049a425c44dd314a10154774764c11090220070fb775e71dda6a68f7fc9e0c762fbf96021908911f0de0ca8e9b0c613cb896", + "id": "bd346035d4516b85fb3a2cce6260fdcc6f1c434999e586978e065de3bf98e02a", + "senderId": "DDAHPjVTTV3uur653TB27fcLGh7XXWnvxW" + }, + { + "type": 2, + "amount": 0, + "fee": 0, + "recipientId": null, + "senderPublicKey": "03f264a6d2ebb62279313a6fd7fec4e2244785839b625a0b0c261e689ce5401d87", + "timestamp": 0, + "asset": { + "delegate": { + "username": "genesis_9", + "publicKey": "03f264a6d2ebb62279313a6fd7fec4e2244785839b625a0b0c261e689ce5401d87" + } + }, + "signature": "30450221009f74425c2ec50dbee462e735dee3e7917c8433fd5250ff09af4506c38d2df05902206a14a19b9a5defe3c8c59c77d52c182ea34d81d2e0b05dc5925133f2829a1960", + "id": "b48068fb7c848ffd57e82a4d381f53bb69916f3943e0e8935971a028ba245564", + "senderId": "DFHdEBuVCz5zfj8yeo3BmKEdsEKpMaYRRw" + }, + { + "type": 2, + "amount": 0, + "fee": 0, + "recipientId": null, + "senderPublicKey": "03efd265a086c2a099cda4f4fd202adbac07567e1229ce5e6fe39963b714c1e2d5", + "timestamp": 0, + "asset": { + "delegate": { + "username": "genesis_10", + "publicKey": "03efd265a086c2a099cda4f4fd202adbac07567e1229ce5e6fe39963b714c1e2d5" + } + }, + "signature": "3044022004df492965ed328134aa6443d38ac4dd951a640e00330da9aa4e80c1577af41a0220588f030f5f9584959647898bb977a1ffe6bba639b1c64a728880f2cd3fd7aa3c", + "id": "73b3b4375e39aabe51ec205559cd728a18c987dabaa0599c611b3076c38c7a49", + "senderId": "DL7Y6smfHHs3Ms3hAYmSYYd5PZukmtDY1i" + }, + { + "type": 2, + "amount": 0, + "fee": 0, + "recipientId": null, + "senderPublicKey": "027d616d20f03c375067676c79ff9787e8e42991fbd9e878501d704d23d246d9b0", + "timestamp": 0, + "asset": { + "delegate": { + "username": "genesis_11", + "publicKey": "027d616d20f03c375067676c79ff9787e8e42991fbd9e878501d704d23d246d9b0" + } + }, + "signature": "3044022051c2f8af62163ca621eeb3087a35bfaca0d679f7be8b19a25972f5a4b24ad8c90220422f3e0e480bf1bf2211e871a102edc15a957c0f97a553d9d707418e6538df26", + "id": "80f1d01158452da31d44f0c24f464a0ade37da51d2f61356ad75a019a91a1ff5", + "senderId": "DBVoRSXBHBPPvssBXrswv22r4dUSpN1fbA" + }, + { + "type": 2, + "amount": 0, + "fee": 0, + "recipientId": null, + "senderPublicKey": "038918951152a37b74dfe61115f83e4b5e3521145065650c4a6d3e94add57d9a9b", + "timestamp": 0, + "asset": { + "delegate": { + "username": "genesis_12", + "publicKey": "038918951152a37b74dfe61115f83e4b5e3521145065650c4a6d3e94add57d9a9b" + } + }, + "signature": "3045022100facf6ed992c28d41595419666b006800fcb33c6bad4b522e013b4d688e51dc8502207695e968059f7a35486389c430d6a3037e69d3e5f1d4f0a294d8818e4750cf0d", + "id": "86d76b0aad8f496d8c20926bfdeb50ad10db242ea6152b68266680c48e1e1aca", + "senderId": "DHsSK81gRWjgNx1A9gtHgkRsEwshsog7AM" + }, + { + "type": 2, + "amount": 0, + "fee": 0, + "recipientId": null, + "senderPublicKey": "03231d8f2f39925fa79efc8f8561e6a8d29b95164a753cbb604a46e8a2e96606fc", + "timestamp": 0, + "asset": { + "delegate": { + "username": "genesis_13", + "publicKey": "03231d8f2f39925fa79efc8f8561e6a8d29b95164a753cbb604a46e8a2e96606fc" + } + }, + "signature": "304402204c627ec3d24fb7b4f86709c0566cee9909ebddb26039e87a2fa673f1f7227362022003be5aa3303b8f4cdab768f80b4699440a61814950cab0fd983526771c4c52ec", + "id": "464614909ac7531a016a0489d78defe262dc0934324f41199975ad42a86f37ac", + "senderId": "DDr7UTGQuPTjxLDWZ8RMjWJMKNXAMj3Bor" + }, + { + "type": 2, + "amount": 0, + "fee": 0, + "recipientId": null, + "senderPublicKey": "021e6d971e5885a3147ddf1e45bf5c8d0887ad9fc659e24bdf95c2c9607e7e3fe8", + "timestamp": 0, + "asset": { + "delegate": { + "username": "genesis_14", + "publicKey": "021e6d971e5885a3147ddf1e45bf5c8d0887ad9fc659e24bdf95c2c9607e7e3fe8" + } + }, + "signature": "3045022100898e59efe518745d3eb3f2b16f7b6192e3289bb4289d43013224549f2015aa4902204e7be92cbba37a05551151e46224da4e5d0ad86ee2106d3a9c0b9afee5f1c4cf", + "id": "9559866ff439959529f69b0947ad2e72d739511ee1f6533c0bca2ebd6dd4ae4a", + "senderId": "DRXNNQ9gQXh6VNUVKaAn9xHAViyiHKtBHZ" + }, + { + "type": 2, + "amount": 0, + "fee": 0, + "recipientId": null, + "senderPublicKey": "03d5b3efbe98631443c5cdf4de8a610dd2655b86427bf70aa209451b54256f6758", + "timestamp": 0, + "asset": { + "delegate": { + "username": "genesis_15", + "publicKey": "03d5b3efbe98631443c5cdf4de8a610dd2655b86427bf70aa209451b54256f6758" + } + }, + "signature": "3044022037fa085e37a582b2e0b3734d44b813bb18be939f73100c5b6f977d4f53ae708f022064ae54f6a1b17b193ab6b6d633f7b7a7b8171a158cdba7480afe380f383930dc", + "id": "7bab92d5397a4ad291c5d01b8d681e480d19b437a7ab5cbd4c6807c96ef2716f", + "senderId": "DT12wf9erZyNJbBQrpbPDmfH3J8txiDgTE" + }, + { + "type": 2, + "amount": 0, + "fee": 0, + "recipientId": null, + "senderPublicKey": "0297f2e8e609b2a6799214481e7573a043a197f8adf7b8bb306576fc3da83d2aaa", + "timestamp": 0, + "asset": { + "delegate": { + "username": "genesis_16", + "publicKey": "0297f2e8e609b2a6799214481e7573a043a197f8adf7b8bb306576fc3da83d2aaa" + } + }, + "signature": "304402202eee94bc3b53c64f8dee7790fe3eed8639da8faf0aa1f785e921cf139df0fb7e02200224efb0c07ae3972287c12a32143c1356adb93e00ac9e04a1358c8245a24cab", + "id": "1e59740fa596b615231660974d0b656122b799a8b13102ade8c1b779aa5de7b5", + "senderId": "DKGYWPSqa4m4z6h3433rNFbWPDdvHj5wwd" + }, + { + "type": 2, + "amount": 0, + "fee": 0, + "recipientId": null, + "senderPublicKey": "0361b914fd5823bf39ae467e95d99e9f6ddb7d85cc6df3055ce00274b8e4a976cc", + "timestamp": 0, + "asset": { + "delegate": { + "username": "genesis_17", + "publicKey": "0361b914fd5823bf39ae467e95d99e9f6ddb7d85cc6df3055ce00274b8e4a976cc" + } + }, + "signature": "3044022002ad92b9b9d81dabf96ac7d90034debc55eeeae879b3fe6ffc026bde86bb7ad902205c57d31c5e5e0099b504ba4c49e220a00ff325dceb64c46aefbb7a0ad8570099", + "id": "bf305776da902802923c19b9d2c7f1a809b0847992131cfa578d5e5518c924bf", + "senderId": "DJshaeFyHcFTjiGJnVPaDmFXhnJ9bp96i5" + }, + { + "type": 2, + "amount": 0, + "fee": 0, + "recipientId": null, + "senderPublicKey": "03fa6bc09bd2ff348b304e0cfbc2d2ec50aa3b9aee0de6a66c13fcd8ee5ac891cd", + "timestamp": 0, + "asset": { + "delegate": { + "username": "genesis_18", + "publicKey": "03fa6bc09bd2ff348b304e0cfbc2d2ec50aa3b9aee0de6a66c13fcd8ee5ac891cd" + } + }, + "signature": "3045022100be50b19c17a9ff221aae20394a45d92ea47e8c1072b6d5a302937d2fc48cba8002205e9bcb3471a734c07ceff0083ad9ba1570507a29e5014e889ba42a85e797cb5e", + "id": "44e48364b5b8cff3c68ae03de7dfde8d7ba6bcb99bf82b32fdc8bc3d0d9adeca", + "senderId": "DSuNttSb1UvCWg8iormfwPwi67EA84P5Mu" + }, + { + "type": 2, + "amount": 0, + "fee": 0, + "recipientId": null, + "senderPublicKey": "03241957edca9ed28308e35cbf36762d22de706ebbd7c6a3a2d235d905d660c5c7", + "timestamp": 0, + "asset": { + "delegate": { + "username": "genesis_19", + "publicKey": "03241957edca9ed28308e35cbf36762d22de706ebbd7c6a3a2d235d905d660c5c7" + } + }, + "signature": "3045022100c11f8b863133535192e6c3fff20253a2695a2df74cdf1445d4ca0966803f708c0220200d4c2723d84f6334ba5d1cc1a0d45854867f4523fbcc9d09b3d53dd1972950", + "id": "5cba288f9ffc1361ba8f7f19f28347ffd917f37df8cf46ba1e0816725f288528", + "senderId": "DCZt1ozEVvPdYVvkHmUKK6k7gnyNNQDpMq" + }, + { + "type": 2, + "amount": 0, + "fee": 0, + "recipientId": null, + "senderPublicKey": "035ae2364c838bc21edf4c04a99c85799f26fb02cc0740c5a1c67d4dc1748ff913", + "timestamp": 0, + "asset": { + "delegate": { + "username": "genesis_20", + "publicKey": "035ae2364c838bc21edf4c04a99c85799f26fb02cc0740c5a1c67d4dc1748ff913" + } + }, + "signature": "304402203066f06a1c165795d8a069499a8c0998913ec93e689219f14145754aa3e26e4e02206e9f88da16f1f8a8ebaf481eff798452487738714fe9b5694fec6a5ef8c152a5", + "id": "ada1696532f7faad1dda594bc6db7bfc029a1759402c924348b74222873a3a27", + "senderId": "D7JyqWMPKhhRNQcKTAvrPGBjEjjBcGgPca" + }, + { + "type": 2, + "amount": 0, + "fee": 0, + "recipientId": null, + "senderPublicKey": "023aff4a16c3876e885aea70e5bce9734ce5acc95a2c41c9783f5acd617f7c7533", + "timestamp": 0, + "asset": { + "delegate": { + "username": "genesis_21", + "publicKey": "023aff4a16c3876e885aea70e5bce9734ce5acc95a2c41c9783f5acd617f7c7533" + } + }, + "signature": "3045022100f5150c23596b9479c8b277401ab9e7da9b2275436f3927dabd70395e52c3ea7c02204e318d498b0176b5f05bb96418c49da3375a8d9b47b3b1e72a6f4db30b3f8c34", + "id": "e186a679f2e47300ec2f24c670192bcede1cb12f359cb8e827374b22f41fbe12", + "senderId": "D6itxYJr4n7ZZk2bd9cZbJE1xaDmpfkNFL" + }, + { + "type": 2, + "amount": 0, + "fee": 0, + "recipientId": null, + "senderPublicKey": "0217d7ce9c3754f7fc7e5b4c64a1ff397dc75931cd6c92e32d8b42068ad50fe4eb", + "timestamp": 0, + "asset": { + "delegate": { + "username": "genesis_22", + "publicKey": "0217d7ce9c3754f7fc7e5b4c64a1ff397dc75931cd6c92e32d8b42068ad50fe4eb" + } + }, + "signature": "3045022100b84f69a7ff67ed147fc0a750c3b7b2ecabd582b6d0cb698c0bb4a531daa6ca46022039d2722e486e1674d0db422078d63fcdb90b21bed0dcc1265adff72d0c2bf8b9", + "id": "86d9d146b62dbafe212aba5ec9764223b67f72c3c1aa93e54a270e3a528a8b20", + "senderId": "DDy4aKhF3cMadGhjFZnjaA1tx2rwnSEWcc" + }, + { + "type": 2, + "amount": 0, + "fee": 0, + "recipientId": null, + "senderPublicKey": "024019207f50dcb3e8aeb9ac1b00993d2bf131346e7e6d296429ea813a8373818e", + "timestamp": 0, + "asset": { + "delegate": { + "username": "genesis_23", + "publicKey": "024019207f50dcb3e8aeb9ac1b00993d2bf131346e7e6d296429ea813a8373818e" + } + }, + "signature": "3045022100aa83596b740639ee8947aa6d0f0ee123e4a5b87c39a4c6dd8a50304d4a7c97d102205fd45f85f5bdb076585a77888ef880bea52ade689731dff694d777de34913efc", + "id": "6301b791844e02116df528b1ea46d788e91521189c3828ce224e45a1b72cda59", + "senderId": "D6BwyDJkNFkaDLedcJTE4rPUw5bRtb4K8f" + }, + { + "type": 2, + "amount": 0, + "fee": 0, + "recipientId": null, + "senderPublicKey": "0275db912c21dca0f0213a76f4544137d7c741b47f281cfd4f8b7cb8187e7ce3cc", + "timestamp": 0, + "asset": { + "delegate": { + "username": "genesis_24", + "publicKey": "0275db912c21dca0f0213a76f4544137d7c741b47f281cfd4f8b7cb8187e7ce3cc" + } + }, + "signature": "3045022100c7eda0d9cd7ef522615643d1b985c73add2d3612344bdcc0117779fa4f4f54d302203e33fb5d185f5174e9cb7634a3d307b74d3bb56cc2354024ce69c74905a85203", + "id": "eee776fcb8024469eacab3e4b23c3d14185326431369aa84f17921abab8ad0ad", + "senderId": "DHQSmrRdfYAp9Y6CuebKnkoQNzuN7Pk2oQ" + }, + { + "type": 2, + "amount": 0, + "fee": 0, + "recipientId": null, + "senderPublicKey": "0331c615ca4bc89d4eeb8d7a9cfbb5c0d4ce49d2f480afbce499b0c7f8c6a24f2f", + "timestamp": 0, + "asset": { + "delegate": { + "username": "genesis_25", + "publicKey": "0331c615ca4bc89d4eeb8d7a9cfbb5c0d4ce49d2f480afbce499b0c7f8c6a24f2f" + } + }, + "signature": "304402203e69be3a73c5917d89d58f3c0ae18febbbf364d3f9dfbec6b526a5294f9c435902201750bcf6368c181aabc53c73fd271a2967a6f215e1d0506eded5dd1800fea1c8", + "id": "ec3d17c6d38c0b9848c7cb57b968efd1f3872b1d1b8bcfb74bae2b0aaa15877c", + "senderId": "D6EVFQx5Z7M2X9DWXHtfX51CtVekuKPMQF" + }, + { + "type": 2, + "amount": 0, + "fee": 0, + "recipientId": null, + "senderPublicKey": "0338ca9b719f8047580eed23b64a40aecad3803a12c0dde83e3ec2c2a9bfaa8147", + "timestamp": 0, + "asset": { + "delegate": { + "username": "genesis_26", + "publicKey": "0338ca9b719f8047580eed23b64a40aecad3803a12c0dde83e3ec2c2a9bfaa8147" + } + }, + "signature": "3045022100e0bf90949739012b641793da162b3daa88b34c8753ee31b26850729e9df579810220439a3f2f1b8e719767ee68df46f4bc1f18c8c3b2da4118edff22396616d319fb", + "id": "14cd65c5f28f4cefc7c0157518a24f90c2260eb7166105b6b3358d91164ddf39", + "senderId": "DLCQ1jPsYbBCV7JfUJTasKbKoyGbK4a4HG" + }, + { + "type": 2, + "amount": 0, + "fee": 0, + "recipientId": null, + "senderPublicKey": "03127001718bee76f14133272f0f4a928ffa8c2b38cafd94d7100253dac732c644", + "timestamp": 0, + "asset": { + "delegate": { + "username": "genesis_2", + "publicKey": "03127001718bee76f14133272f0f4a928ffa8c2b38cafd94d7100253dac732c644" + } + }, + "signature": "3044022003d2e76aca2848aedfe25415c11b9368dc72f687b66bef4527b40e2997b86b8c022076f7f82cbeb282d26535a2c1f0af0f02b48025d42c1bd56ac687fba1a3adb706", + "id": "0daff3992b54b1384f52f751c933c727cbaaf4fac435eba88a1817a425753614", + "senderId": "D9rv3h61heDYHQ3b3Xk3V5epHSTTC6Vn1d" + }, + { + "type": 2, + "amount": 0, + "fee": 0, + "recipientId": null, + "senderPublicKey": "0241734825ba45b6de29d6f26242c25ae1ef125b82615ee89a9fdd5b0f3c6b5132", + "timestamp": 0, + "asset": { + "delegate": { + "username": "genesis_28", + "publicKey": "0241734825ba45b6de29d6f26242c25ae1ef125b82615ee89a9fdd5b0f3c6b5132" + } + }, + "signature": "3045022100bb2903424bcd0a72da531470779144d60286191bea1b200c5617ae4f92229ba6022046a876e3e6cb85469a16f34d2f937e2eef787011c6a313ee50258f15116148ac", + "id": "bd17dbd23f8dbba2736688702ac185a87c88c43b24ee6d7764a5b4138b2f38b7", + "senderId": "DAcQPbKa8zBWwDHbxj37N13C61iseMDWM9" + }, + { + "type": 2, + "amount": 0, + "fee": 0, + "recipientId": null, + "senderPublicKey": "03b9409203d7091e3f4d49168529b749e942ed18f21beddd236d57d692f09a8f86", + "timestamp": 0, + "asset": { + "delegate": { + "username": "genesis_29", + "publicKey": "03b9409203d7091e3f4d49168529b749e942ed18f21beddd236d57d692f09a8f86" + } + }, + "signature": "3044022016d7ecfa776930a6f83464548e7a686735fde752903539a38eb9da0ce2488bbd02203c5e23a4072c8de35a90b296145cce3156a31cc0d754b8a37d363fb088bc7387", + "id": "16e02d3ef24dca4b03a1e489e20335224f18d888ed04f7e3512572f8e0cf92ae", + "senderId": "D5mmTaDAMSyPNKiDKrqwTFGWzWrZA3xaF8" + }, + { + "type": 2, + "amount": 0, + "fee": 0, + "recipientId": null, + "senderPublicKey": "02c7b92a2d0027309e21855cf9c42a432b21ad13925e9dfc206f9c01e18fefa08a", + "timestamp": 0, + "asset": { + "delegate": { + "username": "genesis_30", + "publicKey": "02c7b92a2d0027309e21855cf9c42a432b21ad13925e9dfc206f9c01e18fefa08a" + } + }, + "signature": "30450221009de8828a7ad87cb5d52900e09d5beb680f9edc7640a3707d08a379511a7ba0f102202aa1d9294f9631f1325f252adb87c0d866e7398ce410037a42dc861d94308e15", + "id": "fece556bee4de2c7f1bb3099a05a84a33d0c963979fe1a222a899c13b7abb1fc", + "senderId": "DJ3NywAwQh4srbooLH1jTs9ma1hJE79v3z" + }, + { + "type": 2, + "amount": 0, + "fee": 0, + "recipientId": null, + "senderPublicKey": "0221297804a26a93bb441a9d20a2916abf27fa7b29967678ef1a7a58062f73f40d", + "timestamp": 0, + "asset": { + "delegate": { + "username": "genesis_31", + "publicKey": "0221297804a26a93bb441a9d20a2916abf27fa7b29967678ef1a7a58062f73f40d" + } + }, + "signature": "3045022100b969611ef532557fa3da8a0325b2c88f3ebec954d64f158431d86b8e07929ea50220520affdcd0728cb7c5f63a58a1200d44133e90b1f7a6a9e28744ad6b0dcc2a75", + "id": "ee086317ea2fdc522f5eb502a0db9f3d4955b2318559e40a1f22a3f5f8d6344b", + "senderId": "D5P7eti7FUY4Tk5KXoxdf2tDAVQrRVCESA" + }, + { + "type": 2, + "amount": 0, + "fee": 0, + "recipientId": null, + "senderPublicKey": "027f504f6f20648e3bf171952629c7b868a2f799aa4b60f8eb3fe96afff16bbef0", + "timestamp": 0, + "asset": { + "delegate": { + "username": "genesis_32", + "publicKey": "027f504f6f20648e3bf171952629c7b868a2f799aa4b60f8eb3fe96afff16bbef0" + } + }, + "signature": "3044022006be7cbaa74089cabe47d02621f756762587d210a3f211ee941b5fcd0650908f02207d4040408bd25a2de03e5724362735ee8ad36c099b0c16efd4716e1dd7ec62ae", + "id": "764dd21aa4d0e2e0fa17bb2ff5e7ca304995d9e3593542badecc8ed24d5ea3ea", + "senderId": "D9q26yBTrEYuxHg7bbfZphv6129KvLu4v2" + }, + { + "type": 2, + "amount": 0, + "fee": 0, + "recipientId": null, + "senderPublicKey": "031954315b84db8f49ab7ee21357270450bb68d06b34472e5e93ddfa5710edc0c9", + "timestamp": 0, + "asset": { + "delegate": { + "username": "genesis_33", + "publicKey": "031954315b84db8f49ab7ee21357270450bb68d06b34472e5e93ddfa5710edc0c9" + } + }, + "signature": "3045022100859f93df994d86995fdf834bfe86b41eebaa04e5ab7d09f0b37acb50d313cd9802203c8993b793602c96d305fa795a9f2459f4706b340993584f3c56579392c0995c", + "id": "efd9e7c638afe62bec9be61783193ea52eea7b335053bd5af6c758d5b0e5847c", + "senderId": "D9iPFb5kAVnuDdomehRP9LncJj5ng2vrsr" + }, + { + "type": 2, + "amount": 0, + "fee": 0, + "recipientId": null, + "senderPublicKey": "0267b310eac2bb0d6594de382a1ab74ac75b91e9d64a590b6249247b10fd9be829", + "timestamp": 0, + "asset": { + "delegate": { + "username": "genesis_34", + "publicKey": "0267b310eac2bb0d6594de382a1ab74ac75b91e9d64a590b6249247b10fd9be829" + } + }, + "signature": "3045022100a678978ab899e3903e760ee98640e3f658792a096a8d771c575944af6536cfdb0220428c312f1e0eb4be73ce4b256a754447570176200cfb6c09b3eb55f66526dd80", + "id": "70edcce5df67a250b6ba3567879bae6379ce4c688597fcedfbfd0313da6998e8", + "senderId": "D6xZmtyBzZKCEkK29JNPAD581TJ8XXrXYn" + }, + { + "type": 2, + "amount": 0, + "fee": 0, + "recipientId": null, + "senderPublicKey": "028f32320c66a89779756b04946d2aa256dff6cd547349d46e1938710063e387c4", + "timestamp": 0, + "asset": { + "delegate": { + "username": "genesis_35", + "publicKey": "028f32320c66a89779756b04946d2aa256dff6cd547349d46e1938710063e387c4" + } + }, + "signature": "304402206bc95876897527b39eacf4c961f9c036a9c8a0e53a17ce925c592d079fa643030220096e115d7fbd54aca4af7f621d64178dfcf2c13361106a3e3b5025dca97b44ee", + "id": "7f23f44157f3a677e81514fa431227410a27442e5fd1f2491b177c0f580f296d", + "senderId": "D9dW4eXJjABDQXSQB9GtvY5UBuRWWWejWb" + }, + { + "type": 2, + "amount": 0, + "fee": 0, + "recipientId": null, + "senderPublicKey": "0218b889a24988527ab3948d80f97cfc37b923082e1f0398bc162190fd66ec4dee", + "timestamp": 0, + "asset": { + "delegate": { + "username": "genesis_36", + "publicKey": "0218b889a24988527ab3948d80f97cfc37b923082e1f0398bc162190fd66ec4dee" + } + }, + "signature": "3045022100c40a3f4cf15f9274e2b25ca8608cb965316aa0f00fa77817b79620ad8ccbdd5902206203a1043b03ba58aa9b7399694f8215cf45d30eb0caa748cc06f1a85a8faea9", + "id": "a65244ed17a9280aa694abdf6804b1a0b78dfc052b4845abcd3c89380159b29e", + "senderId": "DFHK7SdmPdjxNZ9uweqLZAv6v5GQ1NnBNe" + }, + { + "type": 2, + "amount": 0, + "fee": 0, + "recipientId": null, + "senderPublicKey": "035392ee88c60617764b4fe89ae2cc96560dfa5f992b03be31ce5680db9b863f73", + "timestamp": 0, + "asset": { + "delegate": { + "username": "genesis_37", + "publicKey": "035392ee88c60617764b4fe89ae2cc96560dfa5f992b03be31ce5680db9b863f73" + } + }, + "signature": "3044022036200c3191f8f01b77676644b9b94728b5afb2ab2de8c5c7c5582e795465661c02207848f1f2f0ab378d8906fd45aa048f354d5dbac4cb87c15973ffa86fe84ff0cd", + "id": "219e0942afe5f65c548ec2118a1c49febb7ec03fca4334ac16649062db9d146b", + "senderId": "DSh7AAC9KahXU2JZ539HAqEa5sHafxsxDQ" + }, + { + "type": 2, + "amount": 0, + "fee": 0, + "recipientId": null, + "senderPublicKey": "03e75127d1deccf65844a1761bd26611b6c65c5b51a52eba27e3ee20a539fd63f1", + "timestamp": 0, + "asset": { + "delegate": { + "username": "genesis_38", + "publicKey": "03e75127d1deccf65844a1761bd26611b6c65c5b51a52eba27e3ee20a539fd63f1" + } + }, + "signature": "304402201a2990b2baae72f5cc8f2d1890f328e4082af0cf2a787d8f05208c3424ce089d0220790dbc7606dd6c03568fd0a771e9e8e89557257238ae90cfcb3bb8f3b475987b", + "id": "ee9ad2a66e9b2009a9fc671f80d0493803fc422161140169c7bc1fd401cd9ad6", + "senderId": "D85WuxGZrFs1QUYTvnRpmc6dd8rmBbpnaX" + }, + { + "type": 2, + "amount": 0, + "fee": 0, + "recipientId": null, + "senderPublicKey": "0329fc1580906307ac9f2f55cec66e47983f8287d542408fb19f473a305d3638d8", + "timestamp": 0, + "asset": { + "delegate": { + "username": "genesis_39", + "publicKey": "0329fc1580906307ac9f2f55cec66e47983f8287d542408fb19f473a305d3638d8" + } + }, + "signature": "30450221008f66e89ec4c7af4b77e5b7ff36c542cc02672c8df70806b5a0fab7a7e8c7067502200d99ba19ceb1b471c39c4e95107ad6f8b978a623a790080b16f863347fe06b4f", + "id": "dd3077ed04a76343d340074270ce9826354802bd99e08cb864c1c5ad09f367df", + "senderId": "D85kwsBJKZ4pw5uQpc81eRj95f6a536AP6" + }, + { + "type": 2, + "amount": 0, + "fee": 0, + "recipientId": null, + "senderPublicKey": "035ec848e9388877dac88f121d19c8f5e870ac90d8ccb0116be9f734e4bd1a9405", + "timestamp": 0, + "asset": { + "delegate": { + "username": "genesis_40", + "publicKey": "035ec848e9388877dac88f121d19c8f5e870ac90d8ccb0116be9f734e4bd1a9405" + } + }, + "signature": "304402202b220d6c028bc23213edddaf303f18eef059551891aadbf7a4b4d7d3287457bb0220245678354bb8960b42ba2f2ceb12f926e82ff0d027b44988d799c8c0d8d7d9f2", + "id": "3afc6ea52b8edc7df0230ceac71baf45460f3bd761c5e75fe796bc7415063220", + "senderId": "DGBJdDadBwJD2xY8VsdAykdd6vPakMMUt6" + }, + { + "type": 2, + "amount": 0, + "fee": 0, + "recipientId": null, + "senderPublicKey": "0356f5885306e45402aeb354a74d13c104699b3b53da46a5e922e4a6d6132a67e8", + "timestamp": 0, + "asset": { + "delegate": { + "username": "genesis_41", + "publicKey": "0356f5885306e45402aeb354a74d13c104699b3b53da46a5e922e4a6d6132a67e8" + } + }, + "signature": "3045022100f18bf2e013f2d9dcac013a76037d787f79baaa65f4f31ffe2b4ed8de249bdc8902202abcf77e809599d3e3a96225363c8e760ed4b4e20f97645547b381dba830c3da", + "id": "aea1fc173a2f4a9233b0fe59a5f6804167bee5658cb3e4e19dfe2be20f5772cd", + "senderId": "DG4VbapL3H39NJLB3DqQEefU47EMVqtxVw" + }, + { + "type": 2, + "amount": 0, + "fee": 0, + "recipientId": null, + "senderPublicKey": "03ff8ab980434516ca28c982d0ecc8fc3107116d6c8b3e09c7ee5033f32adbd2ff", + "timestamp": 0, + "asset": { + "delegate": { + "username": "genesis_42", + "publicKey": "03ff8ab980434516ca28c982d0ecc8fc3107116d6c8b3e09c7ee5033f32adbd2ff" + } + }, + "signature": "3045022100e938d9901afeaa5a56d18abd9292ace93be03c84c09a6c4cb58fca96dfb54bc502201e921d27f9886d189f803b14d93655a42c4e095d49ee61051a4e70c7a173f3f1", + "id": "f18426d3ef81d4b7bf0337d70afcecddbd6db2206a2f139f1ca5823c381c7817", + "senderId": "DC3oNWedP48ypGxAeKbFC7gMjWxcNc2JhL" + }, + { + "type": 2, + "amount": 0, + "fee": 0, + "recipientId": null, + "senderPublicKey": "0393f1590771a8ad1cf2baa086858f3029c4444cb82243917a7011f1f66cf8fd05", + "timestamp": 0, + "asset": { + "delegate": { + "username": "genesis_43", + "publicKey": "0393f1590771a8ad1cf2baa086858f3029c4444cb82243917a7011f1f66cf8fd05" + } + }, + "signature": "304502210095745c36a8af07e21546bd064f1ed1bd90e6c2a8db9c0c8e4853d0a8255443db0220259d2ce3677abb42f08b9d22aa13bbe383fd882ed38911b738ebaefc04589694", + "id": "6c51bea35b5e3270dcf7b7dfae8d984e19f476ea7e0435f157c4e0d22b7e7ea1", + "senderId": "DJm2sfcUKhyxakowY9TjyAytkdq7JrFgVj" + }, + { + "type": 2, + "amount": 0, + "fee": 0, + "recipientId": null, + "senderPublicKey": "0234e24ff1dbc447c804eb385cd05bbd1dc59ef03b44a3346b13e7cccf00b61075", + "timestamp": 0, + "asset": { + "delegate": { + "username": "genesis_44", + "publicKey": "0234e24ff1dbc447c804eb385cd05bbd1dc59ef03b44a3346b13e7cccf00b61075" + } + }, + "signature": "3045022100ee1e8df480f2be042386d383d776b3fd6bd2d3f5a9035071153f23dbfdceeaae02203a0834aae4834da3ca7858779d474b9255ead754867d5b4a18873e9ecaa5045e", + "id": "66fb3e36233f4577ba585ccd7daf83e62d8df262d3d832b806479ac67c1ef35d", + "senderId": "D5oS8xfNebiPsjpwPWoZS6sA9qcYjTGT5h" + }, + { + "type": 2, + "amount": 0, + "fee": 0, + "recipientId": null, + "senderPublicKey": "03a5789a4486f20f1fdca78a52b528b3bf9952e7c057de71a22adcfb444ba4c5d3", + "timestamp": 0, + "asset": { + "delegate": { + "username": "genesis_45", + "publicKey": "03a5789a4486f20f1fdca78a52b528b3bf9952e7c057de71a22adcfb444ba4c5d3" + } + }, + "signature": "3045022100cb037530bcff9a4d19899431648747022c28aa3239563379d96692bd525eb38902205f3cabb8dd470d9eb3d425e333ad1bc9f0643d489c600a811748fb5f4a203f7f", + "id": "5df9c5e350136571af4b86697bc9d4cfca3ff8b669e254b36f00be1dbde063f7", + "senderId": "D5SzHHdPdGqYUkH7BGNkmGHEUqfZrWb17r" + }, + { + "type": 2, + "amount": 0, + "fee": 0, + "recipientId": null, + "senderPublicKey": "0347f692345fa7bf90e944eb55246da5f9f595d3f5a20ad50aeb6f9b973aaae17e", + "timestamp": 0, + "asset": { + "delegate": { + "username": "genesis_46", + "publicKey": "0347f692345fa7bf90e944eb55246da5f9f595d3f5a20ad50aeb6f9b973aaae17e" + } + }, + "signature": "3045022100c377efe5ffab58017473699cd7c839dcf48fa5b20b5ddf9bdc4801e22a579b2b02204d35c1a1416069544e3ec01d2ce21bb409f9f2fa4adedc8c03d6417c034a3fec", + "id": "da4cfad78e37d56421dd6676e5618a507340ef1e496831d1968c509e35ef9202", + "senderId": "DCLdibuZB6UsJP8KmdzcDLWzizrDtJQuxt" + }, + { + "type": 2, + "amount": 0, + "fee": 0, + "recipientId": null, + "senderPublicKey": "028a32b441377a69aa76e867026f3109b2f0aef8651fe91e2a4ab01eff102a6b98", + "timestamp": 0, + "asset": { + "delegate": { + "username": "genesis_47", + "publicKey": "028a32b441377a69aa76e867026f3109b2f0aef8651fe91e2a4ab01eff102a6b98" + } + }, + "signature": "3045022100e098672958be15989bb125d9018adb4a54e95ab664e64a673997e617e28b39df02206e8459997074d5976b77f90eb9d7180e9d4a0e0efdf433958ffeb2f04d9de382", + "id": "85bafcd07e7ba47ec95cb5b5a6759d4f9f87e036bb7660c7717504e845ef975e", + "senderId": "DSkivgRyimdAVqmm2ZAKwKmKN39WEbbPnL" + }, + { + "type": 2, + "amount": 0, + "fee": 0, + "recipientId": null, + "senderPublicKey": "0223ac52179903e79865b9a98cf0b52ddc1ab46180c157e8f6bd1e63e7f14fcf31", + "timestamp": 0, + "asset": { + "delegate": { + "username": "genesis_48", + "publicKey": "0223ac52179903e79865b9a98cf0b52ddc1ab46180c157e8f6bd1e63e7f14fcf31" + } + }, + "signature": "304402200a005716f67d6cd3963a3c752c95f1bca01aa127c91ab1a632eb3022d11e3e67022024c4746078e440da441bcb366ee8999ffd2419e9a6f9cbf971d696d5b7f8733b", + "id": "0df1ed07d3f95ddf0385bad83a17b3a8fde6bd6532cd3479e48668064672b34f", + "senderId": "DDgKyKqdA6SuamB1eW77WvFu6RQFMZoU36" + }, + { + "type": 2, + "amount": 0, + "fee": 0, + "recipientId": null, + "senderPublicKey": "039de0390f28c7731d86ae7006a31888f12856cde3cc3c2619d4d4a42b6dfd6c51", + "timestamp": 0, + "asset": { + "delegate": { + "username": "genesis_49", + "publicKey": "039de0390f28c7731d86ae7006a31888f12856cde3cc3c2619d4d4a42b6dfd6c51" + } + }, + "signature": "3045022100efa5d51ca79992be4a87af049b3e9ec1b796576e4d937ea9e3760ab0bdcd301e022027e22a6c3395df155bd399643c241e4cc317eaead1f273fd7a709339dfa9dc99", + "id": "436bebc107fad38e944fd14785e09f0600df4d75d31cf3eac53f850462d0be74", + "senderId": "DKCaoaXApw1xE7K1BJcVkr1KGzjKmFWyTk" + }, + { + "type": 2, + "amount": 0, + "fee": 0, + "recipientId": null, + "senderPublicKey": "02b87b0e70a7ae10613390f405620e24c495ba2b0cfcdbc67688e9b483dea564ee", + "timestamp": 0, + "asset": { + "delegate": { + "username": "genesis_50", + "publicKey": "02b87b0e70a7ae10613390f405620e24c495ba2b0cfcdbc67688e9b483dea564ee" + } + }, + "signature": "304502210096cdd35f803a37730ac73a97a23061dceac96319c67bfb1ddcfbac737febe96102202fa0b279f697da3afc043ffd3ecc838789be07ff119b5527a5c13468cecf66e9", + "id": "bb65f9dbe6272fd07a555fc86762d6a487f538b972f2926ff7698cdc906a32df", + "senderId": "DJQXFKEguZVabsAs46JbXXnQJ5jFhUtN9m" + }, + { + "type": 2, + "amount": 0, + "fee": 0, + "recipientId": null, + "senderPublicKey": "03c9f8f4001216603c152b4b4429c2ead322ac34672999e808d567a7d1140e46be", + "timestamp": 0, + "asset": { + "delegate": { + "username": "genesis_51", + "publicKey": "03c9f8f4001216603c152b4b4429c2ead322ac34672999e808d567a7d1140e46be" + } + }, + "signature": "3045022100ee961089d02d7bb68fe2257f6a972eeaf6e2c1a1ad2f491c417e161fedbb556b02204c834644e5b5cde9a0b3f92fa23bade7670efab0a067597f6c151ee633932706", + "id": "cef44df9684f05dab67c0568a2c5295bb50cbb3c88f5cfbe672365bda274620f", + "senderId": "DKpt7cm2tZk4RPLyQ5ugwEH7gkriRaA7ov" + }, + { + "type": 2, + "amount": 0, + "fee": 0, + "recipientId": null, + "senderPublicKey": "02cf70f73328d490cfb03ee822d3fc0cf9259d67c0564e843491e739501809d657", + "timestamp": 0, + "asset": { + "delegate": { + "username": "genesis_27", + "publicKey": "02cf70f73328d490cfb03ee822d3fc0cf9259d67c0564e843491e739501809d657" + } + }, + "signature": "30440220645b912b60f829c0bce58bfe9890ef9253418b6898416aaead663bdf158a99f2022061abbbabd454ec7f7e3f4b502216eec28110e945a4b9b913b1fc0b9758e7e6e4", + "id": "09408dbcf3e3e0835bf92a05330c023a7d6471f3825301a34efa094e0fd4fc30", + "senderId": "DQfjSqDuKr5YZaLAF8rWpFMqMYwEbPtGKg" + } + ], + "height": 1, + "id": "13149578060728881902", + "blockSignature": "3045022100a6605198e0f590c88798405bc76748d84e280d179bcefed2c993e70cded2a5dd022008c7f915b89fc4f3250fc4b481abb753c68f30ac351871c50bd6cfaf151370e8" +} diff --git a/packages/core-container/__tests__/__stubs__/config/network/dynamic-fees.json b/packages/core-container/__tests__/__stubs__/config/network/dynamic-fees.json new file mode 100644 index 0000000000..92af028d5d --- /dev/null +++ b/packages/core-container/__tests__/__stubs__/config/network/dynamic-fees.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/network/index.js b/packages/core-container/__tests__/__stubs__/config/network/index.js new file mode 100644 index 0000000000..9b1b944d73 --- /dev/null +++ b/packages/core-container/__tests__/__stubs__/config/network/index.js @@ -0,0 +1,5 @@ +const dynamicFees = require("./dynamic-fees.json"); +const milestones = require("./milestones.json"); +const network = require("./network.json"); + +module.exports = { dynamicFees, milestones, network }; diff --git a/packages/core-container/__tests__/__stubs__/config/network/milestones.json b/packages/core-container/__tests__/__stubs__/config/network/milestones.json new file mode 100644 index 0000000000..51c32313cf --- /dev/null +++ b/packages/core-container/__tests__/__stubs__/config/network/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/network.json b/packages/core-container/__tests__/__stubs__/config/network/network.json new file mode 100644 index 0000000000..0c68bb2a14 --- /dev/null +++ b/packages/core-container/__tests__/__stubs__/config/network/network.json @@ -0,0 +1,18 @@ +{ + "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" + }, + "exceptions": {} +} diff --git a/packages/core-container/__tests__/__stubs__/config/peers.json b/packages/core-container/__tests__/__stubs__/config/peers.json new file mode 100644 index 0000000000..e212ecdd33 --- /dev/null +++ b/packages/core-container/__tests__/__stubs__/config/peers.json @@ -0,0 +1,12 @@ +{ + "list": [ + { + "ip": "127.0.0.1", + "port": 4102 + }, + { + "ip": "127.0.0.1", + "port": 4202 + } + ] +} 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..20cad6133b --- /dev/null +++ b/packages/core-container/__tests__/config/loaders/file-loader.test.ts @@ -0,0 +1,41 @@ +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")), + dynamicFees: require(resolve(__dirname, "../../__stubs__/config/network/dynamic-fees")), + genesisBlock: require(resolve(__dirname, "../../__stubs__/config/genesisBlock")), + milestones: require(resolve(__dirname, "../../__stubs__/config/network/milestones")), + network: require(resolve(__dirname, "../../__stubs__/config/network/network")), +}; + +let loader; +beforeEach(() => { + loader = new FileLoader(); + process.env.ARK_PATH_CONFIG = stubConfigPath; +}); + +afterEach(() => { + delete process.env.ARK_PATH_CONFIG; +}); + +describe("Config Loader", () => { + it("should fail without a config", async () => { + await expect(loader.setUp()).rejects.toThrowError("Invalid network configuration provided."); + }); + + it("should succeed with a config", async () => { + const network = Network.setUp({}); + + await loader.setUp(network); + + expect(loader.delegates).toEqual(stubConfig.delegates); + expect(loader.genesisBlock).toEqual(stubConfig.genesisBlock); + expect(loader.network).toContainAllKeys([...Object.keys(stubConfig.network), ...["milestones", "dynamicFees"]]); + }); +}); diff --git a/packages/core-container/__tests__/config/loaders/remote-loader.test.ts b/packages/core-container/__tests__/config/loaders/remote-loader.test.ts new file mode 100644 index 0000000000..f62c77295e --- /dev/null +++ b/packages/core-container/__tests__/config/loaders/remote-loader.test.ts @@ -0,0 +1,139 @@ +import "jest-extended"; + +import { existsSync, pathExistsSync, removeSync } from "fs-extra"; +import * as mockProcess from "jest-mock-process"; + +import axios from "axios"; +import MockAdapter from "axios-mock-adapter"; +import { RemoteLoader } from "../../../src/config/loaders"; + +const axiosMock = new MockAdapter(axios); +const configDir = "./__test-remote-config__"; + +let testSubject; + +afterAll(() => { + removeSync(configDir); +}); + +beforeEach(() => { + testSubject = new RemoteLoader({ + remote: "127.0.0.1:4002", + config: configDir, + data: "./data", + }); +}); + +afterEach(() => { + axiosMock.reset(); +}); + +describe.skip("Remote Loader", () => { + it("should ensure the config directory exists", () => { + expect(pathExistsSync(testSubject.config)).toBeTrue(); + }); + + describe("__configureNetwork", () => { + it("should not be OK", async () => { + const mockExit = mockProcess.mockProcessExit(); + + axiosMock.onGet("http://127.0.0.1:4002/config/network").reply(() => [404, {}]); + + await testSubject.__configureNetwork(); + + expect(mockExit).toHaveBeenCalledWith(1); + }); + + it("should be OK", async () => { + axiosMock.onGet("http://127.0.0.1:4002/config/network").reply(() => [ + 200, + { + data: require("../../crypto/src/networks/ark/devnet.json"), + }, + ]); + + await testSubject.__configureNetwork(); + + expect(existsSync(`${configDir}/network.json`)).toBeTrue(); + }); + }); + + describe("__configureGenesisBlock", () => { + it("should not be OK", async () => { + axiosMock.onGet("http://127.0.0.1:4002/config/genesis-block").reply(() => [404, {}]); + + await expect(testSubject.__configureGenesisBlock()).rejects.toThrowError(); + }); + + it("should be OK", async () => { + axiosMock.onGet("http://127.0.0.1:4002/config/genesis-block").reply(() => [ + 200, + { + data: require("../../core/src/config/devnet/genesisBlock.json"), + }, + ]); + + await testSubject.__configureGenesisBlock(); + + expect(existsSync(`${configDir}/genesisBlock.json`)).toBeTrue(); + }); + }); + + describe("__configurePeers", () => { + it("should not be OK", async () => { + const mockExit = mockProcess.mockProcessExit(); + + axiosMock.onGet("http://127.0.0.1:4002/config/peers").reply(() => [404, {}]); + + await testSubject.__configurePeers(); + + expect(mockExit).toHaveBeenCalledWith(1); + }); + + it("should be OK", async () => { + axiosMock.onGet("http://127.0.0.1:4002/config/peers").reply(() => [ + 200, + { + data: require("../../core/src/config/devnet/peers.json"), + }, + ]); + + await testSubject.__configurePeers(); + + expect(existsSync(`${configDir}/peers.json`)).toBeTrue(); + }); + }); + + describe("__configureDelegates", () => { + it("should not be OK", async () => { + const mockExit = mockProcess.mockProcessExit(); + + axiosMock.onGet("http://127.0.0.1:4002/config/delegates").reply(() => [404, {}]); + + await testSubject.__configureDelegates(); + + expect(mockExit).toHaveBeenCalledWith(1); + }); + + it("should be OK", async () => { + axiosMock.onGet("http://127.0.0.1:4002/config/delegates").reply(() => [ + 200, + { + data: require("../../core/src/config/devnet/delegates.json"), + }, + ]); + + await testSubject.__configureDelegates(); + + expect(existsSync(`${configDir}/delegates.json`)).toBeTrue(); + }); + }); + + describe("__configurePlugins", () => { + it("should be OK", async () => { + await testSubject.__configurePlugins({ name: "devnet" }); + + expect(existsSync(`${configDir}/plugins.js`)).toBeTrue(); + }); + }); +}); diff --git a/packages/core-container/src/config/index.ts b/packages/core-container/src/config/index.ts new file mode 100644 index 0000000000..0374c054dc --- /dev/null +++ b/packages/core-container/src/config/index.ts @@ -0,0 +1,22 @@ +import { FileLoader, RemoteLoader } from "./loaders"; +import { Network } from "./network"; + +export class Config { + public static async setUp(variables, options) { + // Check if we need to retrieve remote configuration files! + if (variables.remote) { + const remoteLoader = new RemoteLoader(variables); + await remoteLoader.setUp(); + } + + // Setup the network based on the CLI input + const network = Network.setUp(variables); + + // Load the local configuration files + const loader = new FileLoader(); + // TODO: remove network from here + await loader.setUp(network, options); + + return loader; + } +} 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..99c5cc84de --- /dev/null +++ b/packages/core-container/src/config/loaders/file-loader.ts @@ -0,0 +1,147 @@ +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 { schema } from "../schema"; + +export class FileLoader { + public network: any; + public peers: any; + public delegates: any; + public genesisBlock: any; + public milestones: any; + public dynamicFees: any; + + private options: any; + + /** + * Make the config instance. + * @param {Object} options + * @return {Loader} + */ + public async setUp(network, options: object = {}) { + if (!network) { + throw new Error("Invalid network configuration provided."); + } + + this.options = options; + + const { value, error } = Joi.validate(network, schema); + + if (error) { + throw error; + } + + await this.createFromDirectory(); + + configManager.setConfig(value); + + // TODO: change once the config object has been implemented + this.network = configManager.all(); + this.milestones = configManager.get("milestones"); + this.dynamicFees = configManager.get("dynamicFees"); + + return this; + } + + public get(key: string, defaultValue: any = null): any { + // TODO: change to a config object that holds all values + return get(this.network, key, defaultValue); + } + + public set(key: string, value: any): void { + // TODO: change to a config object that holds all values + set(this.network, key, value); + } + + /** + * Get constants for the specified height. + * @param {Number} height + * @return {void} + */ + public getMilestone(height: number): void { + return configManager.getMilestone(height); + } + + /** + * Load and bind the config. + * @return {void} + */ + private 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} + */ + private createBindings(files: Record): void { + for (const [key, value] of Object.entries(files)) { + this[key] = require(value); + } + } + + /** + * 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: 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) { + // + } + } + } + } +} 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..6d1ff138aa --- /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/config/loaders/remote-loader.ts b/packages/core-container/src/config/loaders/remote-loader.ts new file mode 100644 index 0000000000..60e5ad2891 --- /dev/null +++ b/packages/core-container/src/config/loaders/remote-loader.ts @@ -0,0 +1,120 @@ +import { models } from "@arkecosystem/crypto"; +import axios from "axios"; +import { spawnSync } from "child_process"; +import expandHomeDir from "expand-home-dir"; +import { copySync, ensureDirSync, existsSync, writeFileSync } from "fs-extra"; +import { resolve } from "path"; + +export class RemoteLoader { + private remote: any; + private config: any; + + constructor(variables) { + this.remote = variables.remote; + this.config = expandHomeDir(variables.config); + + ensureDirSync(this.config); + } + + public async setUp() { + const network = await this.configureNetwork(); + + await this.configureMilestones(); + + await this.configureGenesisBlock(); + + await this.configurePeers(); + + await this.configureDelegates(); + + this.configurePlugins(network); + + this.configureDatabase(network); + } + + private async configureNetwork() { + const network = await this.getConfig("network"); + + this.writeConfig("network", network); + + return network; + } + + 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 genesisBlockModel = new Block(genesisBlock); + + if (!genesisBlockModel.verification.verified) { + // tslint:disable-next-line:no-console + console.error("Failed to verify the genesis block. Try another remote host."); + process.exit(1); + } + + this.writeConfig("genesisBlock", genesisBlock); + } + + private async configurePeers() { + const peers = await this.getConfig("peers"); + + this.writeConfig("peers", peers); + } + + private async configureDelegates() { + const delegates = await this.getConfig("delegates"); + + this.writeConfig("delegates", delegates); + } + + private configurePlugins(network) { + const plugins = resolve(__dirname, `../../core/src/config/${network.name}/plugins.js`); + + copySync(plugins, `${this.config}/plugins.js`); + } + + private configureDatabase(network) { + const command = spawnSync("createdb", [`ark_${network.name}`]); + + if (command.stderr.length > 0) { + // tslint:disable-next-line:no-console + console.error(command.stderr.toString()); + process.exit(1); + } + + // tslint:disable-next-line:no-console + console.info(command.stdout.toString()); + } + + private async getConfig(type) { + try { + const { data } = await axios.get(`http://${this.remote}/config/${type}`, { + headers: { "Content-Type": "application/json" }, + }); + + return data.data; + } catch (error) { + if (!this.exists(type)) { + // tslint:disable-next-line:no-console + console.error(error.message); + process.exit(1); + } + } + } + + private writeConfig(file, data) { + writeFileSync(`${this.config}/${file}.json`, JSON.stringify(data, null, 4)); + } + + 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..04637898ff --- /dev/null +++ b/packages/core-container/src/config/network.ts @@ -0,0 +1,35 @@ +import { NetworkManager } from "@arkecosystem/crypto"; +import expandHomeDir from "expand-home-dir"; +import { resolve } from "path"; + +export class Network { + /** + * Export all network variables for the core environment. + * @return {void} + */ + public static setUp(variables: any) { + let config; + + if (variables.token && variables.network) { + config = NetworkManager.findByName(variables.network, variables.token); + } else { + try { + const networkPath = resolve(expandHomeDir(`${process.env.ARK_PATH_CONFIG}/network`)); + + 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.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..2129ac86da --- /dev/null +++ b/packages/core-container/src/config/schema.ts @@ -0,0 +1,87 @@ +import Joi from "joi"; + +export const schema = Joi.object({ + delegates: Joi.object({ + secrets: Joi.array().items(Joi.string()), + bip38: Joi.string(), + }), + genesisBlock: Joi.object(), + dynamicFees: Joi.object({ + enabled: Joi.boolean().required(), + minFeePool: Joi.number() + .integer() + .positive() + .required(), + minFeeBroadcast: Joi.number() + .integer() + .positive() + .required(), + addonBytes: Joi.object() + .keys({ + transfer: Joi.number() + .integer() + .required(), + secondSignature: Joi.number() + .integer() + .required(), + delegateRegistration: Joi.number() + .integer() + .required(), + vote: Joi.number() + .integer() + .required(), + multiSignature: Joi.number() + .integer() + .required(), + ipfs: Joi.number() + .integer() + .required(), + timelockTransfer: Joi.number() + .integer() + .required(), + multiPayment: Joi.number() + .integer() + .required(), + delegateResignation: Joi.number() + .integer() + .required(), + }) + .required(), + }).required(), + milestones: Joi.array() + .items(Joi.object()) + .required(), + 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(), + }), + exceptions: Joi.object({ + blocks: Joi.array().items(Joi.string()), + transactions: Joi.array().items(Joi.string()), + }).required(), + outlookTable: Joi.object(), + transactionIdFixTable: Joi.object(), + }).required(), +}); From 8359460c863b326d9906ef53fe90149d2c43f3ea Mon Sep 17 00:00:00 2001 From: Brian Faust Date: Sun, 16 Dec 2018 16:34:31 +0200 Subject: [PATCH 37/63] refactor(core-container): move mapping logic from file loader to config loader --- packages/core-container/src/config/index.ts | 70 ++++++++++++--- .../src/config/loaders/file-loader.ts | 86 +++++-------------- .../src/config/loaders/index.ts | 4 +- packages/core-container/src/container.ts | 4 +- 4 files changed, 81 insertions(+), 83 deletions(-) diff --git a/packages/core-container/src/config/index.ts b/packages/core-container/src/config/index.ts index 0374c054dc..f6e1310e9f 100644 --- a/packages/core-container/src/config/index.ts +++ b/packages/core-container/src/config/index.ts @@ -1,22 +1,66 @@ -import { FileLoader, RemoteLoader } from "./loaders"; +import { configManager as crypto } 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 { fileLoader, RemoteLoader } from "./loaders"; import { Network } from "./network"; -export class Config { - public static async setUp(variables, options) { - // Check if we need to retrieve remote configuration files! - if (variables.remote) { - const remoteLoader = new RemoteLoader(variables); +class Config { + public network: any; + public peers: any; + public delegates: any; + public genesisBlock: any; + public milestones: any; + public dynamicFees: any; + + public async setUp(opts) { + if (opts.remote) { + const remoteLoader = new RemoteLoader(opts); await remoteLoader.setUp(); } - // Setup the network based on the CLI input - const network = Network.setUp(variables); + const { config, files } = await fileLoader.setUp(Network.setUp(opts)); + + for (const [key, value] of Object.entries(files)) { + this[key] = value; + } + + this.configureCrypto(config); - // Load the local configuration files - const loader = new FileLoader(); - // TODO: remove network from here - await loader.setUp(network, options); + return this; + } + + public get(key: string, defaultValue: any = null): any { + return get(this.network, key, defaultValue); + } - return loader; + public set(key: string, value: any): void { + set(this.network, 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.network = crypto.all(); + this.milestones = crypto.get("milestones"); + this.dynamicFees = crypto.get("dynamicFees"); } } + +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 index 99c5cc84de..03b5779ed4 100644 --- a/packages/core-container/src/config/loaders/file-loader.ts +++ b/packages/core-container/src/config/loaders/file-loader.ts @@ -7,86 +7,40 @@ import set from "lodash/set"; import { basename, extname, resolve } from "path"; import { schema } from "../schema"; -export class FileLoader { - public network: any; - public peers: any; - public delegates: any; - public genesisBlock: any; - public milestones: any; - public dynamicFees: any; - - private options: any; - +class FileLoader { /** * Make the config instance. - * @param {Object} options + * @param {Object} opts * @return {Loader} */ - public async setUp(network, options: object = {}) { - if (!network) { + public async setUp(opts) { + if (!opts) { throw new Error("Invalid network configuration provided."); } - this.options = options; - - const { value, error } = Joi.validate(network, schema); + const { value, error } = Joi.validate(opts, schema); if (error) { throw error; } - await this.createFromDirectory(); - - configManager.setConfig(value); - - // TODO: change once the config object has been implemented - this.network = configManager.all(); - this.milestones = configManager.get("milestones"); - this.dynamicFees = configManager.get("dynamicFees"); - - return this; - } - - public get(key: string, defaultValue: any = null): any { - // TODO: change to a config object that holds all values - return get(this.network, key, defaultValue); - } - - public set(key: string, value: any): void { - // TODO: change to a config object that holds all values - set(this.network, key, value); - } - - /** - * Get constants for the specified height. - * @param {Number} height - * @return {void} - */ - public getMilestone(height: number): void { - return configManager.getMilestone(height); + return { config: value, files: await this.createFromDirectory() }; } /** * Load and bind the config. * @return {void} */ - private async createFromDirectory(): Promise { + private async createFromDirectory() { const files: Record = this.getFiles(); - this.createBindings(files); + for (const [key, value] of Object.entries(files)) { + files[key] = require(value); + } await this.buildPeers(files.peers); - } - /** - * Bind the config values to the instance. - * @param {Object} files - * @return {void} - */ - private createBindings(files: Record): void { - for (const [key, value] of Object.entries(files)) { - this[key] = require(value); - } + return files; } /** @@ -115,16 +69,14 @@ export class FileLoader { * @param {String} configFile * @return {void} */ - private async buildPeers(configFile: string): Promise { - if (this.peers.sources) { - const output = require(configFile); - - for (const source of this.peers.sources) { + private async buildPeers(configFile: any): Promise { + if (configFile.sources) { + for (const source of configFile.sources) { // Local File... if (source.startsWith("/")) { - output.list = require(source); + configFile.list = require(source); - writeFileSync(configFile, JSON.stringify(output, null, 2)); + writeFileSync(configFile, JSON.stringify(configFile, null, 2)); break; } @@ -133,9 +85,9 @@ export class FileLoader { try { const response = await axios.get(source); - output.list = response.data; + configFile.list = response.data; - writeFileSync(configFile, JSON.stringify(output, null, 2)); + writeFileSync(configFile, JSON.stringify(configFile, null, 2)); break; } catch (error) { @@ -145,3 +97,5 @@ export class FileLoader { } } } + +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 index 6d1ff138aa..d53018b463 100644 --- a/packages/core-container/src/config/loaders/index.ts +++ b/packages/core-container/src/config/loaders/index.ts @@ -1,4 +1,4 @@ -import { FileLoader } from "./file-loader"; +import { fileLoader } from "./file-loader"; import { RemoteLoader } from "./remote-loader"; -export { FileLoader, RemoteLoader }; +export { fileLoader, RemoteLoader }; diff --git a/packages/core-container/src/container.ts b/packages/core-container/src/container.ts index 471a12f052..8fd1dc5a77 100644 --- a/packages/core-container/src/container.ts +++ b/packages/core-container/src/container.ts @@ -2,7 +2,7 @@ import { createContainer } from "awilix"; import { execSync } from "child_process"; import delay from "delay"; import semver from "semver"; -import { Config } from "./config"; +import { configManager } from "./config"; import { Environment } from "./environment"; import { PluginRegistrar } from "./registrars/plugin"; @@ -73,7 +73,7 @@ export class Container { } // Setup the configuration - this.config = await Config.setUp(variables, options); + this.config = await configManager.setUp(variables); // TODO: Move this out eventually - not really the responsibility of the container this.plugins = new PluginRegistrar(this, options); From f60b5b4b823092d27e980b4b440c6f3884d8d269 Mon Sep 17 00:00:00 2001 From: Brian Faust Date: Sun, 16 Dec 2018 17:19:57 +0200 Subject: [PATCH 38/63] refactor: expose app config through getters --- .../repositories/transactions.test.ts | 2 -- .../__tests__/v1/handlers/blocks.test.ts | 2 +- .../src/versions/1/blocks/controller.ts | 8 +++--- .../src/versions/1/loader/controller.ts | 12 +++++---- .../src/versions/1/peers/transformer.ts | 2 +- .../src/versions/2/node/controller.ts | 12 +++++---- .../src/versions/2/peers/transformer.ts | 2 +- .../versions/2/transactions/transformer.ts | 2 +- packages/core-blockchain/src/state-machine.ts | 6 ++--- .../config/loaders/file-loader.test.ts | 17 +++++------- packages/core-container/src/config/index.ts | 27 ++++++++----------- packages/core-database-postgres/src/spv.ts | 2 +- packages/core-database/src/interface.ts | 6 ++--- packages/core-database/src/wallet-manager.ts | 8 +++--- packages/core-forger/src/manager.ts | 4 +-- packages/core-p2p/src/court/guard.ts | 2 +- packages/core-p2p/src/peer.ts | 8 +++--- .../src/server/plugins/set-headers.ts | 4 +-- .../server/versions/config/handlers/index.ts | 10 +++---- .../__tests__/connection.test.ts | 2 +- .../mocks/core-container-calculator.ts | 1 + .../__tests__/delegate-calculator.test.ts | 1 - .../__tests__/supply-calculator.test.ts | 10 +++++-- .../core-utils/src/delegate-calculator.ts | 2 +- packages/core-utils/src/supply-calculator.ts | 2 +- 25 files changed, 78 insertions(+), 76 deletions(-) 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 bd4d17060e..c4f39662a3 100644 --- a/packages/core-api/__tests__/v1/handlers/blocks.test.ts +++ b/packages/core-api/__tests__/v1/handlers/blocks.test.ts @@ -78,7 +78,7 @@ describe("API 1.0 - Blocks", () => { 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/src/versions/1/blocks/controller.ts b/packages/core-api/src/versions/1/blocks/controller.ts index 1489a83771..21cd44e14a 100644 --- a/packages/core-api/src/versions/1/blocks/controller.ts +++ b/packages/core-api/src/versions/1/blocks/controller.ts @@ -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); } @@ -120,7 +120,7 @@ export class BlocksController extends Controller { 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(), }); @@ -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/loader/controller.ts b/packages/core-api/src/versions/1/loader/controller.ts index 1285c7d301..c5fba862f4 100644 --- a/packages/core-api/src/versions/1/loader/controller.ts +++ b/packages/core-api/src/versions/1/loader/controller.ts @@ -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 49046400a5..6cd18d3d94 100644 --- a/packages/core-api/src/versions/1/peers/transformer.ts +++ b/packages/core-api/src/versions/1/peers/transformer.ts @@ -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/2/node/controller.ts b/packages/core-api/src/versions/2/node/controller.ts index 058d149923..fc8cb8cceb 100644 --- a/packages/core-api/src/versions/2/node/controller.ts +++ b/packages/core-api/src/versions/2/node/controller.ts @@ -54,13 +54,15 @@ 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.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 447fc6abb5..f622f658a1 100644 --- a/packages/core-api/src/versions/2/peers/transformer.ts +++ b/packages/core-api/src/versions/2/peers/transformer.ts @@ -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/transactions/transformer.ts b/packages/core-api/src/versions/2/transactions/transformer.ts index eb19632955..d193efe675 100644 --- a/packages/core-api/src/versions/2/transactions/transformer.ts +++ b/packages/core-api/src/versions/2/transactions/transformer.ts @@ -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-blockchain/src/state-machine.ts b/packages/core-blockchain/src/state-machine.ts index 52711ddd69..b1eebc7ddd 100644 --- a/packages/core-blockchain/src/state-machine.ts +++ b/packages/core-blockchain/src/state-machine.ts @@ -162,9 +162,9 @@ blockchainMachine.actionMap = 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:", ); @@ -221,7 +221,7 @@ blockchainMachine.actionMap = 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-container/__tests__/config/loaders/file-loader.test.ts b/packages/core-container/__tests__/config/loaders/file-loader.test.ts index 20cad6133b..ad9e3e6d58 100644 --- a/packages/core-container/__tests__/config/loaders/file-loader.test.ts +++ b/packages/core-container/__tests__/config/loaders/file-loader.test.ts @@ -1,7 +1,7 @@ import "jest-extended"; import { resolve } from "path"; -import { FileLoader } from "../../../src/config/loaders"; +import { fileLoader } from "../../../src/config/loaders"; import { Network } from "../../../src/config/network"; const stubConfigPath = resolve(__dirname, "../../__stubs__/config"); @@ -12,11 +12,10 @@ const stubConfig = { genesisBlock: require(resolve(__dirname, "../../__stubs__/config/genesisBlock")), milestones: require(resolve(__dirname, "../../__stubs__/config/network/milestones")), network: require(resolve(__dirname, "../../__stubs__/config/network/network")), + peers: require(resolve(__dirname, "../../__stubs__/config/peers")), }; -let loader; beforeEach(() => { - loader = new FileLoader(); process.env.ARK_PATH_CONFIG = stubConfigPath; }); @@ -26,16 +25,14 @@ afterEach(() => { describe("Config Loader", () => { it("should fail without a config", async () => { - await expect(loader.setUp()).rejects.toThrowError("Invalid network configuration provided."); + await expect(fileLoader.setUp(null)).rejects.toThrowError("Invalid network configuration provided."); }); it("should succeed with a config", async () => { - const network = Network.setUp({}); + const { files } = await fileLoader.setUp(Network.setUp({})); - await loader.setUp(network); - - expect(loader.delegates).toEqual(stubConfig.delegates); - expect(loader.genesisBlock).toEqual(stubConfig.genesisBlock); - expect(loader.network).toContainAllKeys([...Object.keys(stubConfig.network), ...["milestones", "dynamicFees"]]); + expect(files.delegates).toEqual(stubConfig.delegates); + expect(files.genesisBlock).toEqual(stubConfig.genesisBlock); + expect(files.peers).toEqual(stubConfig.peers); }); }); diff --git a/packages/core-container/src/config/index.ts b/packages/core-container/src/config/index.ts index f6e1310e9f..f6ae99aff8 100644 --- a/packages/core-container/src/config/index.ts +++ b/packages/core-container/src/config/index.ts @@ -1,20 +1,11 @@ import { configManager as crypto } 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 { fileLoader, RemoteLoader } from "./loaders"; import { Network } from "./network"; class Config { - public network: any; - public peers: any; - public delegates: any; - public genesisBlock: any; - public milestones: any; - public dynamicFees: any; + private config: Record; public async setUp(opts) { if (opts.remote) { @@ -25,7 +16,7 @@ class Config { const { config, files } = await fileLoader.setUp(Network.setUp(opts)); for (const [key, value] of Object.entries(files)) { - this[key] = value; + this.config[key] = value; } this.configureCrypto(config); @@ -33,12 +24,16 @@ class Config { return this; } + public all(): any { + return this.config; + } + public get(key: string, defaultValue: any = null): any { - return get(this.network, key, defaultValue); + return get(this.config, key, defaultValue); } public set(key: string, value: any): void { - set(this.network, key, value); + set(this.config, key, value); } /** @@ -57,9 +52,9 @@ class Config { private configureCrypto(value: any): void { crypto.setConfig(value); - this.network = crypto.all(); - this.milestones = crypto.get("milestones"); - this.dynamicFees = crypto.get("dynamicFees"); + this.config.network = crypto.all(); + this.config.milestones = crypto.get("milestones"); + this.config.dynamicFees = crypto.get("dynamicFees"); } } diff --git a/packages/core-database-postgres/src/spv.ts b/packages/core-database-postgres/src/spv.ts index f17c93067d..c1ea4ba18e 100644 --- a/packages/core-database-postgres/src/spv.ts +++ b/packages/core-database-postgres/src/spv.ts @@ -7,7 +7,7 @@ import { queries } from "./queries"; const logger = app.resolvePlugin("logger"); 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; diff --git a/packages/core-database/src/interface.ts b/packages/core-database/src/interface.ts index 0708f51dcf..bc57b0922a 100644 --- a/packages/core-database/src/interface.ts +++ b/packages/core-database/src/interface.ts @@ -447,7 +447,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 @@ -527,11 +527,11 @@ export abstract class ConnectionInterface { return false; } - if (!Array.isArray(this.config.network.exceptions.blocks)) { + if (!Array.isArray(this.config.get("network.exceptions.blocks"))) { return false; } - return this.config.network.exceptions.blocks.includes(block.id); + return this.config.get("network.exceptions.blocks").includes(block.id); } /** diff --git a/packages/core-database/src/wallet-manager.ts b/packages/core-database/src/wallet-manager.ts index 9e6d7ee995..8b76774f49 100644 --- a/packages/core-database/src/wallet-manager.ts +++ b/packages/core-database/src/wallet-manager.ts @@ -23,7 +23,7 @@ export class WalletManager { 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(); } @@ -566,10 +566,12 @@ export class WalletManager { return false; } - if (!Array.isArray(this.config.network.exceptions.transactions)) { + const exceptions: any = this.config.get("network.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-forger/src/manager.ts b/packages/core-forger/src/manager.ts index 1b09a37e80..8cea66dc5f 100644 --- a/packages/core-forger/src/manager.ts +++ b/packages/core-forger/src/manager.ts @@ -28,8 +28,8 @@ export class ForgerManager { this.logger = app.resolvePlugin("logger"); 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); } diff --git a/packages/core-p2p/src/court/guard.ts b/packages/core-p2p/src/court/guard.ts index d608d9d68c..d8a67e0d0f 100644 --- a/packages/core-p2p/src/court/guard.ts +++ b/packages/core-p2p/src/court/guard.ts @@ -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/peer.ts b/packages/core-p2p/src/peer.ts index 18895400a7..61b155e7a7 100755 --- a/packages/core-p2p/src/peer.ts +++ b/packages/core-p2p/src/peer.ts @@ -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 1828865fec..9265676a24 100644 --- a/packages/core-p2p/src/server/plugins/set-headers.ts +++ b/packages/core-p2p/src/server/plugins/set-headers.ts @@ -11,7 +11,7 @@ const config = app.getConfig(); */ 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/config/handlers/index.ts b/packages/core-p2p/src/server/versions/config/handlers/index.ts index 3c452364db..d00e6ace42 100644 --- a/packages/core-p2p/src/server/versions/config/handlers/index.ts +++ b/packages/core-p2p/src/server/versions/config/handlers/index.ts @@ -9,12 +9,12 @@ 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"), + 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), diff --git a/packages/core-transaction-pool/__tests__/connection.test.ts b/packages/core-transaction-pool/__tests__/connection.test.ts index ca3e4a7d42..acc62e353d 100644 --- a/packages/core-transaction-pool/__tests__/connection.test.ts +++ b/packages/core-transaction-pool/__tests__/connection.test.ts @@ -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("network.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-utils/__tests__/__support__/mocks/core-container-calculator.ts b/packages/core-utils/__tests__/__support__/mocks/core-container-calculator.ts index 98b1957d58..d895682cbe 100644 --- a/packages/core-utils/__tests__/__support__/mocks/core-container-calculator.ts +++ b/packages/core-utils/__tests__/__support__/mocks/core-container-calculator.ts @@ -3,6 +3,7 @@ jest.mock("@arkecosystem/core-container", () => { app: { getConfig: () => { return { + get: () => 1000000 * 1e8, getMilestone: () => ({ height: 1, reward: 2 * 1e8, 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 c15909869f..af27cf13bc 100644 --- a/packages/core-utils/__tests__/supply-calculator.test.ts +++ b/packages/core-utils/__tests__/supply-calculator.test.ts @@ -9,7 +9,13 @@ const mockConfig = { milestones: [{ height: 1, reward: 2 }], }; -app.getConfig = jest.fn(() => mockConfig); +app.getConfig = jest.fn(() => { + return { + all: () => { + return mockConfig; + }, + }; +}); app.resolvePlugin = jest.fn(plugin => { if (plugin === "blockchain") { @@ -28,7 +34,7 @@ app.resolvePlugin = jest.fn(plugin => { }); beforeAll(() => { - config = app.getConfig(); + config = app.getConfig().all(); }); describe("Supply calculator", () => { diff --git a/packages/core-utils/src/delegate-calculator.ts b/packages/core-utils/src/delegate-calculator.ts index c59b264cf7..8ceaf7868a 100644 --- a/packages/core-utils/src/delegate-calculator.ts +++ b/packages/core-utils/src/delegate-calculator.ts @@ -17,7 +17,7 @@ function calculateApproval(delegate, height: any = null) { } const constants = config.getMilestone(height); - const totalSupply = new BignumMod(config.genesisBlock.totalAmount).plus( + 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/supply-calculator.ts b/packages/core-utils/src/supply-calculator.ts index f09698c043..9eb518338d 100644 --- a/packages/core-utils/src/supply-calculator.ts +++ b/packages/core-utils/src/supply-calculator.ts @@ -7,7 +7,7 @@ import { Bignum, configManager } from "@arkecosystem/crypto"; * @return {Number} */ function calculate(height) { - const { genesisBlock, milestones } = app.getConfig(); + const { genesisBlock, milestones } = app.getConfig().all(); if (!height) { const blockchain = app.resolvePlugin("blockchain"); From 4df83446228a121fc0af54ac455782554e4c5156 Mon Sep 17 00:00:00 2001 From: Brian Faust Date: Sun, 16 Dec 2018 17:33:52 +0200 Subject: [PATCH 39/63] fix: retrieve config values via getter --- packages/core-container/src/config/index.ts | 4 +--- packages/core-p2p/src/monitor.ts | 12 +++++++----- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/core-container/src/config/index.ts b/packages/core-container/src/config/index.ts index f6ae99aff8..55c50a56ab 100644 --- a/packages/core-container/src/config/index.ts +++ b/packages/core-container/src/config/index.ts @@ -15,9 +15,7 @@ class Config { const { config, files } = await fileLoader.setUp(Network.setUp(opts)); - for (const [key, value] of Object.entries(files)) { - this.config[key] = value; - } + this.config = files; this.configureCrypto(config); diff --git a/packages/core-p2p/src/monitor.ts b/packages/core-p2p/src/monitor.ts index ed46054a22..d1951f4bf1 100755 --- a/packages/core-p2p/src/monitor.ts +++ b/packages/core-p2p/src/monitor.ts @@ -71,7 +71,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}.`); } @@ -818,17 +818,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( From 53455a29bc7dc3c82cf44d6cc9119f1e7282ff75 Mon Sep 17 00:00:00 2001 From: Brian Faust Date: Sun, 16 Dec 2018 17:39:37 +0200 Subject: [PATCH 40/63] fix: retrieve config values via getter --- packages/core-api/src/plugins/validation/formats/address.ts | 2 +- packages/core-api/src/versions/1/transactions/transformer.ts | 2 +- packages/core-blockchain/__tests__/blockchain.test.ts | 4 ++-- packages/core-forger/src/client.ts | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/core-api/src/plugins/validation/formats/address.ts b/packages/core-api/src/plugins/validation/formats/address.ts index dc3008a637..7e4ecc56d7 100644 --- a/packages/core-api/src/plugins/validation/formats/address.ts +++ b/packages/core-api/src/plugins/validation/formats/address.ts @@ -8,7 +8,7 @@ export function registerAddressFormat(ajv) { 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/versions/1/transactions/transformer.ts b/packages/core-api/src/versions/1/transactions/transformer.ts index 76a0e6aafd..8378cc51c9 100644 --- a/packages/core-api/src/versions/1/transactions/transformer.ts +++ b/packages/core-api/src/versions/1/transactions/transformer.ts @@ -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-blockchain/__tests__/blockchain.test.ts b/packages/core-blockchain/__tests__/blockchain.test.ts index 0c22f427f3..c1ae8f4b5a 100644 --- a/packages/core-blockchain/__tests__/blockchain.test.ts +++ b/packages/core-blockchain/__tests__/blockchain.test.ts @@ -42,7 +42,7 @@ beforeAll(async () => { // 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("network.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("network.exceptions.transactions", []); await __resetToHeight1(); diff --git a/packages/core-forger/src/client.ts b/packages/core-forger/src/client.ts index 465e0321d3..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.getConfig().network.nethash, + nethash: app.getConfig().get("network.nethash"), "x-auth": "forger", "Content-Type": "application/json", }; From 792fabdecad306fed638ef801af0459d3c48cf9d Mon Sep 17 00:00:00 2001 From: Brian Faust Date: Sun, 16 Dec 2018 17:44:51 +0200 Subject: [PATCH 41/63] fix: retrieve config values via getter --- .../core-api/src/versions/1/shared/transformers/ports.ts | 6 ++++-- .../core-api/src/versions/2/shared/transformers/ports.ts | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) 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/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 From 65924d1d088cfb9f84a06781f303403a9c3e223e Mon Sep 17 00:00:00 2001 From: Brian Faust Date: Mon, 17 Dec 2018 06:07:00 +0200 Subject: [PATCH 42/63] refactor: handle network and core config separately --- .../{dynamic-fees.json => dynamicFees.json} | 0 .../__stubs__/config/network/index.js | 2 +- .../config/loaders/file-loader.test.ts | 2 +- packages/core-container/src/config/index.ts | 6 ++-- .../src/config/loaders/file-loader.ts | 8 ++++-- packages/core-container/src/config/network.ts | 23 ++++++++++----- packages/core-container/src/config/schema.ts | 28 +++++++++++++++---- .../{dynamic-fees.json => dynamicFees.json} | 0 .../crypto/src/networks/ark/devnet/index.ts | 2 +- .../{dynamic-fees.json => dynamicFees.json} | 0 .../crypto/src/networks/ark/mainnet/index.ts | 2 +- .../{dynamic-fees.json => dynamicFees.json} | 0 .../crypto/src/networks/ark/testnet/index.ts | 2 +- 13 files changed, 52 insertions(+), 23 deletions(-) rename packages/core-container/__tests__/__stubs__/config/network/{dynamic-fees.json => dynamicFees.json} (100%) rename packages/crypto/src/networks/ark/devnet/{dynamic-fees.json => dynamicFees.json} (100%) rename packages/crypto/src/networks/ark/mainnet/{dynamic-fees.json => dynamicFees.json} (100%) rename packages/crypto/src/networks/ark/testnet/{dynamic-fees.json => dynamicFees.json} (100%) diff --git a/packages/core-container/__tests__/__stubs__/config/network/dynamic-fees.json b/packages/core-container/__tests__/__stubs__/config/network/dynamicFees.json similarity index 100% rename from packages/core-container/__tests__/__stubs__/config/network/dynamic-fees.json rename to packages/core-container/__tests__/__stubs__/config/network/dynamicFees.json diff --git a/packages/core-container/__tests__/__stubs__/config/network/index.js b/packages/core-container/__tests__/__stubs__/config/network/index.js index 9b1b944d73..447eddfd21 100644 --- a/packages/core-container/__tests__/__stubs__/config/network/index.js +++ b/packages/core-container/__tests__/__stubs__/config/network/index.js @@ -1,4 +1,4 @@ -const dynamicFees = require("./dynamic-fees.json"); +const dynamicFees = require("./dynamicFees.json"); const milestones = require("./milestones.json"); const network = require("./network.json"); diff --git a/packages/core-container/__tests__/config/loaders/file-loader.test.ts b/packages/core-container/__tests__/config/loaders/file-loader.test.ts index ad9e3e6d58..5d409d6686 100644 --- a/packages/core-container/__tests__/config/loaders/file-loader.test.ts +++ b/packages/core-container/__tests__/config/loaders/file-loader.test.ts @@ -8,7 +8,7 @@ const stubConfigPath = resolve(__dirname, "../../__stubs__/config"); const stubConfig = { delegates: require(resolve(__dirname, "../../__stubs__/config/delegates")), - dynamicFees: require(resolve(__dirname, "../../__stubs__/config/network/dynamic-fees")), + dynamicFees: require(resolve(__dirname, "../../__stubs__/config/network/dynamicFees")), genesisBlock: require(resolve(__dirname, "../../__stubs__/config/genesisBlock")), milestones: require(resolve(__dirname, "../../__stubs__/config/network/milestones")), network: require(resolve(__dirname, "../../__stubs__/config/network/network")), diff --git a/packages/core-container/src/config/index.ts b/packages/core-container/src/config/index.ts index 55c50a56ab..2fbd707415 100644 --- a/packages/core-container/src/config/index.ts +++ b/packages/core-container/src/config/index.ts @@ -13,11 +13,13 @@ class Config { await remoteLoader.setUp(); } - const { config, files } = await fileLoader.setUp(Network.setUp(opts)); + const network = Network.setUp(opts); + + const { config, files } = await fileLoader.setUp(network); this.config = files; - this.configureCrypto(config); + this.configureCrypto(network); return this; } diff --git a/packages/core-container/src/config/loaders/file-loader.ts b/packages/core-container/src/config/loaders/file-loader.ts index 03b5779ed4..7205290780 100644 --- a/packages/core-container/src/config/loaders/file-loader.ts +++ b/packages/core-container/src/config/loaders/file-loader.ts @@ -5,7 +5,7 @@ import Joi from "joi"; import get from "lodash/get"; import set from "lodash/set"; import { basename, extname, resolve } from "path"; -import { schema } from "../schema"; +import { schemaConfig } from "../schema"; class FileLoader { /** @@ -18,13 +18,15 @@ class FileLoader { throw new Error("Invalid network configuration provided."); } - const { value, error } = Joi.validate(opts, schema); + const files = await this.createFromDirectory(); + + const { value, error } = Joi.validate(files, schemaConfig); if (error) { throw error; } - return { config: value, files: await this.createFromDirectory() }; + return { config: value, files }; } /** diff --git a/packages/core-container/src/config/network.ts b/packages/core-container/src/config/network.ts index 04637898ff..e258d09b0f 100644 --- a/packages/core-container/src/config/network.ts +++ b/packages/core-container/src/config/network.ts @@ -1,28 +1,37 @@ import { NetworkManager } from "@arkecosystem/crypto"; import expandHomeDir from "expand-home-dir"; +import Joi from "joi"; import { resolve } from "path"; +import { schemaNetwork } from "./schema"; export class Network { /** - * Export all network variables for the core environment. + * Expose information about the for the operating network to the environment. * @return {void} */ - public static setUp(variables: any) { + public static setUp(opts: any) { let config; - if (variables.token && variables.network) { - config = NetworkManager.findByName(variables.network, variables.token); + if (opts.token && opts.network) { + config = NetworkManager.findByName(opts.network, opts.token); } else { try { - const networkPath = resolve(expandHomeDir(`${process.env.ARK_PATH_CONFIG}/network`)); + const networkPath = resolve(expandHomeDir(`${process.env.ARK_PATH_CONFIG}`)); - config = require(networkPath); + config = { + network: require(`${networkPath}/network`), + milestones: require(`${networkPath}/milestones`), + dynamicFees: require(`${networkPath}/dynamicFees`), + }; } catch (error) { + console.log(error); config = false; } } - if (!config) { + 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.", ); diff --git a/packages/core-container/src/config/schema.ts b/packages/core-container/src/config/schema.ts index 2129ac86da..56dcc33d47 100644 --- a/packages/core-container/src/config/schema.ts +++ b/packages/core-container/src/config/schema.ts @@ -1,11 +1,6 @@ import Joi from "joi"; -export const schema = Joi.object({ - delegates: Joi.object({ - secrets: Joi.array().items(Joi.string()), - bip38: Joi.string(), - }), - genesisBlock: Joi.object(), +export const schemaNetwork = Joi.object({ dynamicFees: Joi.object({ enabled: Joi.boolean().required(), minFeePool: Joi.number() @@ -85,3 +80,24 @@ export const schema = Joi.object({ transactionIdFixTable: Joi.object(), }).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().keys({ + ip: Joi.string() + .ip() + .required(), + port: Joi.number() + .port() + .required(), + version: Joi.string().required(), + }), + ), + plugins: Joi.object().required(), + genesisBlock: Joi.object().required(), +}); diff --git a/packages/crypto/src/networks/ark/devnet/dynamic-fees.json b/packages/crypto/src/networks/ark/devnet/dynamicFees.json similarity index 100% rename from packages/crypto/src/networks/ark/devnet/dynamic-fees.json rename to packages/crypto/src/networks/ark/devnet/dynamicFees.json diff --git a/packages/crypto/src/networks/ark/devnet/index.ts b/packages/crypto/src/networks/ark/devnet/index.ts index dfed411331..da99454a6e 100644 --- a/packages/crypto/src/networks/ark/devnet/index.ts +++ b/packages/crypto/src/networks/ark/devnet/index.ts @@ -1,4 +1,4 @@ -import dynamicFees from "./dynamic-fees.json"; +import dynamicFees from "./dynamicFees.json"; import milestones from "./milestones.json"; import network from "./network.json"; diff --git a/packages/crypto/src/networks/ark/mainnet/dynamic-fees.json b/packages/crypto/src/networks/ark/mainnet/dynamicFees.json similarity index 100% rename from packages/crypto/src/networks/ark/mainnet/dynamic-fees.json rename to packages/crypto/src/networks/ark/mainnet/dynamicFees.json diff --git a/packages/crypto/src/networks/ark/mainnet/index.ts b/packages/crypto/src/networks/ark/mainnet/index.ts index f97c7643a7..831bfe5723 100644 --- a/packages/crypto/src/networks/ark/mainnet/index.ts +++ b/packages/crypto/src/networks/ark/mainnet/index.ts @@ -1,4 +1,4 @@ -import dynamicFees from "./dynamic-fees.json"; +import dynamicFees from "./dynamicFees.json"; import milestones from "./milestones.json"; import network from "./network.json"; diff --git a/packages/crypto/src/networks/ark/testnet/dynamic-fees.json b/packages/crypto/src/networks/ark/testnet/dynamicFees.json similarity index 100% rename from packages/crypto/src/networks/ark/testnet/dynamic-fees.json rename to packages/crypto/src/networks/ark/testnet/dynamicFees.json diff --git a/packages/crypto/src/networks/ark/testnet/index.ts b/packages/crypto/src/networks/ark/testnet/index.ts index 2636532a32..5217bd8519 100644 --- a/packages/crypto/src/networks/ark/testnet/index.ts +++ b/packages/crypto/src/networks/ark/testnet/index.ts @@ -1,4 +1,4 @@ -import dynamicFees from "./dynamic-fees.json"; +import dynamicFees from "./dynamicFees.json"; import milestones from "./milestones.json"; import network from "./network.json"; From f96c53240fbaa97c7864b4f580736d8344703c7c Mon Sep 17 00:00:00 2001 From: Brian Faust Date: Mon, 17 Dec 2018 06:08:42 +0200 Subject: [PATCH 43/63] misc: remove debug log --- packages/core-container/src/config/network.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/core-container/src/config/network.ts b/packages/core-container/src/config/network.ts index e258d09b0f..d230c4af5e 100644 --- a/packages/core-container/src/config/network.ts +++ b/packages/core-container/src/config/network.ts @@ -24,7 +24,6 @@ export class Network { dynamicFees: require(`${networkPath}/dynamicFees`), }; } catch (error) { - console.log(error); config = false; } } From b78b0eeb5c496761616286a941907f6c806da2d1 Mon Sep 17 00:00:00 2001 From: Brian Faust Date: Mon, 17 Dec 2018 06:20:29 +0200 Subject: [PATCH 44/63] fix: adjust test stubs and allow unknown config files --- .../config/{network => }/dynamicFees.json | 0 .../config/{network => }/milestones.json | 0 .../__stubs__/config/{network => }/network.json | 0 .../__tests__/__stubs__/config/network/index.js | 5 ----- .../__tests__/__stubs__/config/plugins.js | 12 ++++++++++++ .../config/loaders/file-loader.test.ts | 17 +++++++++-------- packages/core-container/src/config/network.ts | 2 +- packages/core-container/src/config/schema.ts | 2 +- 8 files changed, 23 insertions(+), 15 deletions(-) rename packages/core-container/__tests__/__stubs__/config/{network => }/dynamicFees.json (100%) rename packages/core-container/__tests__/__stubs__/config/{network => }/milestones.json (100%) rename packages/core-container/__tests__/__stubs__/config/{network => }/network.json (100%) delete mode 100644 packages/core-container/__tests__/__stubs__/config/network/index.js create mode 100644 packages/core-container/__tests__/__stubs__/config/plugins.js diff --git a/packages/core-container/__tests__/__stubs__/config/network/dynamicFees.json b/packages/core-container/__tests__/__stubs__/config/dynamicFees.json similarity index 100% rename from packages/core-container/__tests__/__stubs__/config/network/dynamicFees.json rename to packages/core-container/__tests__/__stubs__/config/dynamicFees.json diff --git a/packages/core-container/__tests__/__stubs__/config/network/milestones.json b/packages/core-container/__tests__/__stubs__/config/milestones.json similarity index 100% rename from packages/core-container/__tests__/__stubs__/config/network/milestones.json rename to packages/core-container/__tests__/__stubs__/config/milestones.json diff --git a/packages/core-container/__tests__/__stubs__/config/network/network.json b/packages/core-container/__tests__/__stubs__/config/network.json similarity index 100% rename from packages/core-container/__tests__/__stubs__/config/network/network.json rename to packages/core-container/__tests__/__stubs__/config/network.json diff --git a/packages/core-container/__tests__/__stubs__/config/network/index.js b/packages/core-container/__tests__/__stubs__/config/network/index.js deleted file mode 100644 index 447eddfd21..0000000000 --- a/packages/core-container/__tests__/__stubs__/config/network/index.js +++ /dev/null @@ -1,5 +0,0 @@ -const dynamicFees = require("./dynamicFees.json"); -const milestones = require("./milestones.json"); -const network = require("./network.json"); - -module.exports = { dynamicFees, milestones, network }; 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 index 5d409d6686..e01cda9ec0 100644 --- a/packages/core-container/__tests__/config/loaders/file-loader.test.ts +++ b/packages/core-container/__tests__/config/loaders/file-loader.test.ts @@ -7,12 +7,13 @@ import { Network } from "../../../src/config/network"; const stubConfigPath = resolve(__dirname, "../../__stubs__/config"); const stubConfig = { + dynamicFees: require(resolve(__dirname, "../../__stubs__/config/dynamicFees")), + milestones: require(resolve(__dirname, "../../__stubs__/config/milestones")), + network: require(resolve(__dirname, "../../__stubs__/config/network")), delegates: require(resolve(__dirname, "../../__stubs__/config/delegates")), - dynamicFees: require(resolve(__dirname, "../../__stubs__/config/network/dynamicFees")), genesisBlock: require(resolve(__dirname, "../../__stubs__/config/genesisBlock")), - milestones: require(resolve(__dirname, "../../__stubs__/config/network/milestones")), - network: require(resolve(__dirname, "../../__stubs__/config/network/network")), peers: require(resolve(__dirname, "../../__stubs__/config/peers")), + plugins: require(resolve(__dirname, "../../__stubs__/config/plugins")), }; beforeEach(() => { @@ -23,16 +24,16 @@ afterEach(() => { delete process.env.ARK_PATH_CONFIG; }); -describe("Config Loader", () => { +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 { files } = await fileLoader.setUp(Network.setUp({})); + const { config } = await fileLoader.setUp(Network.setUp({})); - expect(files.delegates).toEqual(stubConfig.delegates); - expect(files.genesisBlock).toEqual(stubConfig.genesisBlock); - expect(files.peers).toEqual(stubConfig.peers); + expect(config.delegates).toEqual(stubConfig.delegates); + expect(config.genesisBlock).toEqual(stubConfig.genesisBlock); + expect(config.peers).toEqual(stubConfig.peers); }); }); diff --git a/packages/core-container/src/config/network.ts b/packages/core-container/src/config/network.ts index d230c4af5e..66108e4907 100644 --- a/packages/core-container/src/config/network.ts +++ b/packages/core-container/src/config/network.ts @@ -16,7 +16,7 @@ export class Network { config = NetworkManager.findByName(opts.network, opts.token); } else { try { - const networkPath = resolve(expandHomeDir(`${process.env.ARK_PATH_CONFIG}`)); + const networkPath = resolve(expandHomeDir(process.env.ARK_PATH_CONFIG)); config = { network: require(`${networkPath}/network`), diff --git a/packages/core-container/src/config/schema.ts b/packages/core-container/src/config/schema.ts index 56dcc33d47..006b2e915d 100644 --- a/packages/core-container/src/config/schema.ts +++ b/packages/core-container/src/config/schema.ts @@ -100,4 +100,4 @@ export const schemaConfig = Joi.object({ ), plugins: Joi.object().required(), genesisBlock: Joi.object().required(), -}); +}).unknown(); From 9c4b3699ea7fafd67cdafbcf18d483efb095d3e4 Mon Sep 17 00:00:00 2001 From: Brian Faust Date: Mon, 17 Dec 2018 06:27:23 +0200 Subject: [PATCH 45/63] misc(core-container): disable peers_backup schema for now --- packages/core-container/src/config/schema.ts | 23 ++++++++++---------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/packages/core-container/src/config/schema.ts b/packages/core-container/src/config/schema.ts index 006b2e915d..b9694f73bb 100644 --- a/packages/core-container/src/config/schema.ts +++ b/packages/core-container/src/config/schema.ts @@ -87,17 +87,18 @@ export const schemaConfig = Joi.object({ bip38: Joi.string(), }), peers: Joi.object().required(), - peers_backup: Joi.array().items( - Joi.object().keys({ - ip: Joi.string() - .ip() - .required(), - port: Joi.number() - .port() - .required(), - version: Joi.string().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(); From f6a536b57299c10b99a4c0307d875e6a1c30cfe7 Mon Sep 17 00:00:00 2001 From: Brian Faust Date: Mon, 17 Dec 2018 06:46:21 +0200 Subject: [PATCH 46/63] fix(core-container): check for a custom dynamic fees file if using network defaults --- packages/core-container/src/config/network.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/packages/core-container/src/config/network.ts b/packages/core-container/src/config/network.ts index 66108e4907..af72622dcc 100644 --- a/packages/core-container/src/config/network.ts +++ b/packages/core-container/src/config/network.ts @@ -1,5 +1,6 @@ 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"; @@ -12,8 +13,16 @@ export class Network { public static setUp(opts: any) { let config; + // Default configuration... if (opts.token && opts.network) { config = NetworkManager.findByName(opts.network, opts.token); + + // Default configuration + Custom dynamic fees... + const dynamicFees = resolve(expandHomeDir(`${process.env.ARK_PATH_CONFIG}/dynamicFees.json`)); + + if (existsSync(dynamicFees)) { + config.dynamicFees = require(dynamicFees); + } } else { try { const networkPath = resolve(expandHomeDir(process.env.ARK_PATH_CONFIG)); @@ -28,6 +37,7 @@ export class Network { } } + // Validate the configuration... const { error } = Joi.validate(config, schemaNetwork); if (error) { From 64214b438c342cbc7ffb7b03f4181ee607b14762 Mon Sep 17 00:00:00 2001 From: Brian Faust Date: Mon, 17 Dec 2018 07:05:32 +0200 Subject: [PATCH 47/63] refactor: move exceptions into their own configuration file --- .../__tests__/blockchain.test.ts | 4 +- .../__stubs__/config/exceptions.json | 3 ++ .../config/loaders/file-loader.test.ts | 5 ++- packages/core-container/src/config/index.ts | 3 +- packages/core-container/src/config/network.ts | 5 ++- packages/core-container/src/config/schema.ts | 14 +++--- packages/core-database/src/interface.ts | 4 +- packages/core-database/src/wallet-manager.ts | 2 +- .../__tests__/connection.test.ts | 2 +- .../crypto/__tests__/models/block.test.ts | 2 +- packages/crypto/src/crypto/crypto.ts | 2 +- packages/crypto/src/models/block.ts | 2 +- packages/crypto/src/models/transaction.ts | 2 +- .../src/networks/ark/devnet/exceptions.json | 16 +++++++ .../crypto/src/networks/ark/devnet/index.ts | 3 +- .../src/networks/ark/devnet/network.json | 16 ------- .../src/networks/ark/mainnet/exceptions.json | 44 +++++++++++++++++++ .../crypto/src/networks/ark/mainnet/index.ts | 3 +- .../src/networks/ark/mainnet/network.json | 44 ------------------- .../src/networks/ark/testnet/exceptions.json | 3 ++ .../crypto/src/networks/ark/testnet/index.ts | 3 +- .../src/networks/ark/testnet/network.json | 3 +- 22 files changed, 99 insertions(+), 86 deletions(-) create mode 100644 packages/core-container/__tests__/__stubs__/config/exceptions.json create mode 100644 packages/crypto/src/networks/ark/devnet/exceptions.json create mode 100644 packages/crypto/src/networks/ark/mainnet/exceptions.json create mode 100644 packages/crypto/src/networks/ark/testnet/exceptions.json diff --git a/packages/core-blockchain/__tests__/blockchain.test.ts b/packages/core-blockchain/__tests__/blockchain.test.ts index c1ae8f4b5a..4e15437b7c 100644 --- a/packages/core-blockchain/__tests__/blockchain.test.ts +++ b/packages/core-blockchain/__tests__/blockchain.test.ts @@ -42,7 +42,7 @@ beforeAll(async () => { // Workaround: Add genesis transactions to the exceptions list, because they have a fee of 0 // and otherwise don't pass validation. - configManager.set("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(); - configManager.set("network.exceptions.transactions", []); + configManager.set("exceptions.transactions", []); await __resetToHeight1(); 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..8270ba5bdd --- /dev/null +++ b/packages/core-container/__tests__/__stubs__/config/exceptions.json @@ -0,0 +1,3 @@ +{ + "exceptions": {} +} diff --git a/packages/core-container/__tests__/config/loaders/file-loader.test.ts b/packages/core-container/__tests__/config/loaders/file-loader.test.ts index e01cda9ec0..675878cfe3 100644 --- a/packages/core-container/__tests__/config/loaders/file-loader.test.ts +++ b/packages/core-container/__tests__/config/loaders/file-loader.test.ts @@ -7,11 +7,12 @@ import { Network } from "../../../src/config/network"; const stubConfigPath = resolve(__dirname, "../../__stubs__/config"); const stubConfig = { + delegates: require(resolve(__dirname, "../../__stubs__/config/delegates")), dynamicFees: require(resolve(__dirname, "../../__stubs__/config/dynamicFees")), + 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")), - delegates: require(resolve(__dirname, "../../__stubs__/config/delegates")), - genesisBlock: require(resolve(__dirname, "../../__stubs__/config/genesisBlock")), peers: require(resolve(__dirname, "../../__stubs__/config/peers")), plugins: require(resolve(__dirname, "../../__stubs__/config/plugins")), }; diff --git a/packages/core-container/src/config/index.ts b/packages/core-container/src/config/index.ts index 2fbd707415..708c9be2c2 100644 --- a/packages/core-container/src/config/index.ts +++ b/packages/core-container/src/config/index.ts @@ -53,8 +53,9 @@ class Config { crypto.setConfig(value); this.config.network = crypto.all(); - this.config.milestones = crypto.get("milestones"); this.config.dynamicFees = crypto.get("dynamicFees"); + this.config.exceptions = crypto.get("exceptions"); + this.config.milestones = crypto.get("milestones"); } } diff --git a/packages/core-container/src/config/network.ts b/packages/core-container/src/config/network.ts index af72622dcc..619e54ecf5 100644 --- a/packages/core-container/src/config/network.ts +++ b/packages/core-container/src/config/network.ts @@ -28,9 +28,10 @@ export class Network { const networkPath = resolve(expandHomeDir(process.env.ARK_PATH_CONFIG)); config = { - network: require(`${networkPath}/network`), - milestones: require(`${networkPath}/milestones`), dynamicFees: require(`${networkPath}/dynamicFees`), + exceptions: require(`${networkPath}/exceptions`), + milestones: require(`${networkPath}/milestones`), + network: require(`${networkPath}/network`), }; } catch (error) { config = false; diff --git a/packages/core-container/src/config/schema.ts b/packages/core-container/src/config/schema.ts index b9694f73bb..93778c637e 100644 --- a/packages/core-container/src/config/schema.ts +++ b/packages/core-container/src/config/schema.ts @@ -46,6 +46,14 @@ export const schemaNetwork = Joi.object({ milestones: Joi.array() .items(Joi.object()) .required(), + exceptions: Joi.object({ + exceptions: Joi.object({ + blocks: Joi.array().items(Joi.string()), + transactions: Joi.array().items(Joi.string()), + }).required(), + outlookTable: Joi.object(), + transactionIdFixTable: Joi.object(), + }).default({ exceptions: {} }), network: Joi.object({ name: Joi.string().required(), messagePrefix: Joi.string().required(), @@ -72,12 +80,6 @@ export const schemaNetwork = Joi.object({ symbol: Joi.string().required(), explorer: Joi.string().required(), }), - exceptions: Joi.object({ - blocks: Joi.array().items(Joi.string()), - transactions: Joi.array().items(Joi.string()), - }).required(), - outlookTable: Joi.object(), - transactionIdFixTable: Joi.object(), }).required(), }); diff --git a/packages/core-database/src/interface.ts b/packages/core-database/src/interface.ts index bc57b0922a..f5344f7ba6 100644 --- a/packages/core-database/src/interface.ts +++ b/packages/core-database/src/interface.ts @@ -527,11 +527,11 @@ export abstract class ConnectionInterface { return false; } - if (!Array.isArray(this.config.get("network.exceptions.blocks"))) { + if (!Array.isArray(this.config.get("exceptions.blocks"))) { return false; } - return this.config.get("network.exceptions.blocks").includes(block.id); + return this.config.get("exceptions.blocks").includes(block.id); } /** diff --git a/packages/core-database/src/wallet-manager.ts b/packages/core-database/src/wallet-manager.ts index 8b76774f49..6f06c9de09 100644 --- a/packages/core-database/src/wallet-manager.ts +++ b/packages/core-database/src/wallet-manager.ts @@ -566,7 +566,7 @@ export class WalletManager { return false; } - const exceptions: any = this.config.get("network.exceptions.transactions"); + const exceptions: any = this.config.get("exceptions.transactions"); if (!Array.isArray(exceptions)) { return false; diff --git a/packages/core-transaction-pool/__tests__/connection.test.ts b/packages/core-transaction-pool/__tests__/connection.test.ts index acc62e353d..253051d8b3 100644 --- a/packages/core-transaction-pool/__tests__/connection.test.ts +++ b/packages/core-transaction-pool/__tests__/connection.test.ts @@ -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.set("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/crypto/__tests__/models/block.test.ts b/packages/crypto/__tests__/models/block.test.ts index ccd5ef18e1..fd51ceb090 100644 --- a/packages/crypto/__tests__/models/block.test.ts +++ b/packages/crypto/__tests__/models/block.test.ts @@ -6,7 +6,7 @@ import { Block } from "../../src/models/block"; import { Bignum } from "../../src/utils/bignum"; import { dummyBlock } from "./fixtures/block"; -const { outlookTable } = CONFIGURATIONS.ARK.MAINNET.network; +const { outlookTable } = CONFIGURATIONS.ARK.MAINNET.exceptions; describe("Models - Block", () => { const data = { diff --git a/packages/crypto/src/crypto/crypto.ts b/packages/crypto/src/crypto/crypto.ts index d3350d3f8c..8e54cb07c7 100644 --- a/packages/crypto/src/crypto/crypto.ts +++ b/packages/crypto/src/crypto/crypto.ts @@ -12,7 +12,7 @@ import { feeManager } from "../managers/fee"; import { Bignum } from "../utils"; import { HashAlgorithms } from "./hash-algorithms"; -const { transactionIdFixTable } = CONFIGURATIONS.ARK.MAINNET.network; +const { transactionIdFixTable } = CONFIGURATIONS.ARK.MAINNET.exceptions; class Crypto { /** diff --git a/packages/crypto/src/models/block.ts b/packages/crypto/src/models/block.ts index f04f1fb2a6..a4179bee31 100644 --- a/packages/crypto/src/models/block.ts +++ b/packages/crypto/src/models/block.ts @@ -8,7 +8,7 @@ import { configManager } from "../managers/config"; import { Bignum } from "../utils"; import { Transaction } from "./transaction"; -const { outlookTable } = CONFIGURATIONS.ARK.MAINNET.network; +const { outlookTable } = CONFIGURATIONS.ARK.MAINNET.exceptions; const toBytesHex = data => { const temp = data ? new Bignum(data).toString(16) : ""; diff --git a/packages/crypto/src/models/transaction.ts b/packages/crypto/src/models/transaction.ts index c0a0bff1ef..106c2d4f2a 100644 --- a/packages/crypto/src/models/transaction.ts +++ b/packages/crypto/src/models/transaction.ts @@ -8,7 +8,7 @@ import { crypto } from "../crypto/crypto"; import { configManager } from "../managers/config"; import { Bignum } from "../utils"; -const { transactionIdFixTable } = CONFIGURATIONS.ARK.MAINNET.network; +const { transactionIdFixTable } = CONFIGURATIONS.ARK.MAINNET.exceptions; /** * TODO copy some parts to ArkDocs diff --git a/packages/crypto/src/networks/ark/devnet/exceptions.json b/packages/crypto/src/networks/ark/devnet/exceptions.json new file mode 100644 index 0000000000..b186ecbacd --- /dev/null +++ b/packages/crypto/src/networks/ark/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/ark/devnet/index.ts b/packages/crypto/src/networks/ark/devnet/index.ts index da99454a6e..aabd1a2482 100644 --- a/packages/crypto/src/networks/ark/devnet/index.ts +++ b/packages/crypto/src/networks/ark/devnet/index.ts @@ -1,5 +1,6 @@ import dynamicFees from "./dynamicFees.json"; +import exceptions from "./exceptions.json"; import milestones from "./milestones.json"; import network from "./network.json"; -export const devnet = { dynamicFees, milestones, network }; +export const devnet = { dynamicFees, exceptions, milestones, network }; diff --git a/packages/crypto/src/networks/ark/devnet/network.json b/packages/crypto/src/networks/ark/devnet/network.json index f3cbcbbac6..6988d83b6a 100644 --- a/packages/crypto/src/networks/ark/devnet/network.json +++ b/packages/crypto/src/networks/ark/devnet/network.json @@ -13,21 +13,5 @@ "token": "DARK", "symbol": "DѦ", "explorer": "https://dexplorer.ark.io" - }, - "exceptions": { - "blocks": ["15895730198424359628", "14746174532446639362"], - "transactions": [ - "76bd168e57a4431a64617c4e7864df1e0be89831eabaa230e37643efae2def6f", - "90d06cb306dcc33faba59545e03d91ee83b0409e66a45ffe6a9e3b1049a0c521", - "0f7a3e8036fbaae7c76f7615b09b8c4f1337e96d87042d86e03cc5ab9b6ed745", - "23733214f347970a34ccd772f89396056309744688bd6dbc35129e1f12d46d2f", - "e30d7290ca9cab570aa72bf0365dde39b8d75fe65a4e804844e5708a021f8ab4", - "03d3902bb30f71c29151f8b85ff478be1dc5264785c8c84550b6b59339dc03c9", - "7a00dc347a50186bc0d789a7899f1a4dcbc1e5d5adbb5359df238cd2b9363b41", - "bbe266eac2bbc505b40e74ae6d1960d7c76d3ca8d4b942b6046f0c5f750ff9f4", - "cb63ee14068a8d2987c90ecb12998653161cd8748af7790c75592647260d3266", - "d184752c1546c366866013aa00a2a0f9b40463656072334fc302ff783ff4ee98", - "f8122e3d8b7ad31c58ed3254196b16c23249b8372f06de42191c43bfcf39849d" - ] } } diff --git a/packages/crypto/src/networks/ark/mainnet/exceptions.json b/packages/crypto/src/networks/ark/mainnet/exceptions.json new file mode 100644 index 0000000000..c042700d55 --- /dev/null +++ b/packages/crypto/src/networks/ark/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/ark/mainnet/index.ts b/packages/crypto/src/networks/ark/mainnet/index.ts index 831bfe5723..aabd1a2482 100644 --- a/packages/crypto/src/networks/ark/mainnet/index.ts +++ b/packages/crypto/src/networks/ark/mainnet/index.ts @@ -1,5 +1,6 @@ import dynamicFees from "./dynamicFees.json"; +import exceptions from "./exceptions.json"; import milestones from "./milestones.json"; import network from "./network.json"; -export const mainnet = { dynamicFees, milestones, network }; +export const devnet = { dynamicFees, exceptions, milestones, network }; diff --git a/packages/crypto/src/networks/ark/mainnet/network.json b/packages/crypto/src/networks/ark/mainnet/network.json index 34ddafc8e7..6eb5620e77 100644 --- a/packages/crypto/src/networks/ark/mainnet/network.json +++ b/packages/crypto/src/networks/ark/mainnet/network.json @@ -13,49 +13,5 @@ "token": "ARK", "symbol": "Ѧ", "explorer": "https://explorer.ark.io" - }, - "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/exceptions.json b/packages/crypto/src/networks/ark/testnet/exceptions.json new file mode 100644 index 0000000000..8270ba5bdd --- /dev/null +++ b/packages/crypto/src/networks/ark/testnet/exceptions.json @@ -0,0 +1,3 @@ +{ + "exceptions": {} +} diff --git a/packages/crypto/src/networks/ark/testnet/index.ts b/packages/crypto/src/networks/ark/testnet/index.ts index 5217bd8519..aabd1a2482 100644 --- a/packages/crypto/src/networks/ark/testnet/index.ts +++ b/packages/crypto/src/networks/ark/testnet/index.ts @@ -1,5 +1,6 @@ import dynamicFees from "./dynamicFees.json"; +import exceptions from "./exceptions.json"; import milestones from "./milestones.json"; import network from "./network.json"; -export const testnet = { dynamicFees, milestones, network }; +export const devnet = { dynamicFees, exceptions, milestones, network }; diff --git a/packages/crypto/src/networks/ark/testnet/network.json b/packages/crypto/src/networks/ark/testnet/network.json index 0c68bb2a14..0f373e462e 100644 --- a/packages/crypto/src/networks/ark/testnet/network.json +++ b/packages/crypto/src/networks/ark/testnet/network.json @@ -13,6 +13,5 @@ "token": "TARK", "symbol": "TѦ", "explorer": "http://texplorer.ark.io" - }, - "exceptions": {} + } } From 5eca04030d14b3c0fed2853a1fa7c799c8e85047 Mon Sep 17 00:00:00 2001 From: Brian Faust Date: Mon, 17 Dec 2018 07:08:48 +0200 Subject: [PATCH 48/63] fix(crypto): export the correct constants --- packages/crypto/src/networks/ark/mainnet/index.ts | 2 +- packages/crypto/src/networks/ark/testnet/index.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/crypto/src/networks/ark/mainnet/index.ts b/packages/crypto/src/networks/ark/mainnet/index.ts index aabd1a2482..7e71f7eec7 100644 --- a/packages/crypto/src/networks/ark/mainnet/index.ts +++ b/packages/crypto/src/networks/ark/mainnet/index.ts @@ -3,4 +3,4 @@ import exceptions from "./exceptions.json"; import milestones from "./milestones.json"; import network from "./network.json"; -export const devnet = { dynamicFees, exceptions, milestones, network }; +export const mainnet = { dynamicFees, exceptions, milestones, network }; diff --git a/packages/crypto/src/networks/ark/testnet/index.ts b/packages/crypto/src/networks/ark/testnet/index.ts index aabd1a2482..ba4942545e 100644 --- a/packages/crypto/src/networks/ark/testnet/index.ts +++ b/packages/crypto/src/networks/ark/testnet/index.ts @@ -3,4 +3,4 @@ import exceptions from "./exceptions.json"; import milestones from "./milestones.json"; import network from "./network.json"; -export const devnet = { dynamicFees, exceptions, milestones, network }; +export const testnet = { dynamicFees, exceptions, milestones, network }; From cded9da19e06f80522e84ef3e742af3cf5a207be Mon Sep 17 00:00:00 2001 From: Brian Faust Date: Mon, 17 Dec 2018 07:25:42 +0200 Subject: [PATCH 49/63] test(core-container): adjust config stubs --- .../core-container/__tests__/__stubs__/config/network.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/core-container/__tests__/__stubs__/config/network.json b/packages/core-container/__tests__/__stubs__/config/network.json index 0c68bb2a14..0f373e462e 100644 --- a/packages/core-container/__tests__/__stubs__/config/network.json +++ b/packages/core-container/__tests__/__stubs__/config/network.json @@ -13,6 +13,5 @@ "token": "TARK", "symbol": "TѦ", "explorer": "http://texplorer.ark.io" - }, - "exceptions": {} + } } From 73755337619331e9f688fb524860c4b4ca05bafd Mon Sep 17 00:00:00 2001 From: Brian Faust Date: Mon, 17 Dec 2018 07:38:00 +0200 Subject: [PATCH 50/63] refactor(core): remove default values for the token and network --- packages/core/src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 1d0aad4c17..259e30bce9 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -18,7 +18,7 @@ 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("-t, --token ", "token name") .option("-n, --network ", "token network") .option("-r, --remote ", "remote peer for config") .option("--network-start", "force genesis network start", false) From 527e7d654dce558fdb2569a8b0880c38c1c272eb Mon Sep 17 00:00:00 2001 From: Brian Faust Date: Mon, 17 Dec 2018 07:43:51 +0200 Subject: [PATCH 51/63] refactor(core-p2p): add new network configuration endpoints --- .../src/config/loaders/remote-loader.ts | 20 ++++++++++++++++ .../server/versions/config/handlers/index.ts | 24 +++++++++++++++++++ .../src/server/versions/config/index.ts | 3 +++ packages/core/src/index.ts | 2 +- 4 files changed, 48 insertions(+), 1 deletion(-) diff --git a/packages/core-container/src/config/loaders/remote-loader.ts b/packages/core-container/src/config/loaders/remote-loader.ts index 60e5ad2891..9a3c3aebd4 100644 --- a/packages/core-container/src/config/loaders/remote-loader.ts +++ b/packages/core-container/src/config/loaders/remote-loader.ts @@ -19,6 +19,10 @@ export class RemoteLoader { public async setUp() { const network = await this.configureNetwork(); + await this.configureDynamicFees(); + + await this.configureExceptions(); + await this.configureMilestones(); await this.configureGenesisBlock(); @@ -40,6 +44,22 @@ export class RemoteLoader { return network; } + private async configureDynamicFees() { + const dynamicFees = await this.getConfig("dynamicFees"); + + this.writeConfig("dynamicFees", dynamicFees); + + return dynamicFees; + } + + private async configureExceptions() { + const exceptions = await this.getConfig("exceptions"); + + this.writeConfig("exceptions", exceptions); + + return exceptions; + } + private async configureMilestones() { const milestones = await this.getConfig("milestones"); 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 d00e6ace42..7a1acfe19a 100644 --- a/packages/core-p2p/src/server/versions/config/handlers/index.ts +++ b/packages/core-p2p/src/server/versions/config/handlers/index.ts @@ -34,6 +34,30 @@ export const network = { }, }; +export const dynamicFees = { + handler(request, h) { + return { + data: require(`${process.env.ARK_PATH_CONFIG}/dynamicFees.json`), + }; + }, +}; + +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..1344f8058b 100644 --- a/packages/core-p2p/src/server/versions/config/index.ts +++ b/packages/core-p2p/src/server/versions/config/index.ts @@ -9,6 +9,9 @@ const register = async (server, options) => { server.route([ { method: "GET", path: "/", ...handlers.config }, { method: "GET", path: "/network", ...handlers.network }, + { method: "GET", path: "/dynamicFees", ...handlers.dynamicFees }, + { 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/src/index.ts b/packages/core/src/index.ts index 259e30bce9..1d0aad4c17 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -18,7 +18,7 @@ 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") + .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) From cac0bec51e3fc0578f7b4ca884390ae617261ba8 Mon Sep 17 00:00:00 2001 From: Brian Faust Date: Mon, 17 Dec 2018 07:52:42 +0200 Subject: [PATCH 52/63] refactor(core-p2p): return the default dynamicFees file via config endpoint --- .circleci/config.yml | 24 +++++++++---------- .../server/versions/config/handlers/index.ts | 5 +++- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 64ad9c254e..86066c7200 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -86,8 +86,8 @@ jobs: 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' + name: core-graphql + command: 'cd ~/ark-core/packages/core-graphql && yarn test:coverage' - run: name: Last 1000 lines of test output when: on_fail @@ -181,8 +181,8 @@ jobs: 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' + name: core-graphql + command: 'cd ~/ark-core/packages/core-graphql && yarn test:coverage' - run: name: Last 1000 lines of test output when: on_fail @@ -344,8 +344,8 @@ jobs: name: core-logger-winston command: 'cd ~/ark-core/packages/core-logger-winston && yarn test:coverage' - run: - name: core-graphql - command: 'cd ~/ark-core/packages/core-graphql && yarn test:coverage' + name: core-api + command: 'cd ~/ark-core/packages/core-api && yarn test:coverage' - run: name: core-deployer command: 'cd ~/ark-core/packages/core-deployer && yarn test:coverage' @@ -353,8 +353,8 @@ jobs: 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' + name: core + command: 'cd ~/ark-core/packages/core && yarn test:coverage' - run: name: Last 1000 lines of test output when: on_fail @@ -605,8 +605,8 @@ jobs: name: core-logger-winston command: 'cd ~/ark-core/packages/core-logger-winston && yarn test:coverage' - run: - name: core-graphql - command: 'cd ~/ark-core/packages/core-graphql && yarn test:coverage' + name: core-api + command: 'cd ~/ark-core/packages/core-api && yarn test:coverage' - run: name: core-deployer command: 'cd ~/ark-core/packages/core-deployer && yarn test:coverage' @@ -614,8 +614,8 @@ jobs: 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' + name: core + command: 'cd ~/ark-core/packages/core && yarn test:coverage' - run: name: Last 1000 lines of test output when: on_fail 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 7a1acfe19a..4fffbdb0d4 100644 --- a/packages/core-p2p/src/server/versions/config/handlers/index.ts +++ b/packages/core-p2p/src/server/versions/config/handlers/index.ts @@ -10,6 +10,7 @@ export const config = { version: app.getVersion(), network: { version: appConfig.get("network.pubKeyHash"), + name: appConfig.get("network.name"), nethash: appConfig.get("network.nethash"), explorer: appConfig.get("network.client.explorer"), token: { @@ -36,8 +37,10 @@ export const network = { export const dynamicFees = { handler(request, h) { + const networkName = appConfig.get("network.name"); + return { - data: require(`${process.env.ARK_PATH_CONFIG}/dynamicFees.json`), + data: require(`../../../../../../crypto/src/networks/ark/${networkName}/dynamicFees.json`), }; }, }; From 9b8539d3f9262d35caa5da40a4e55a1e032af9b4 Mon Sep 17 00:00:00 2001 From: Brian Faust Date: Mon, 17 Dec 2018 08:33:23 +0200 Subject: [PATCH 53/63] fix(core-container): adjust exceptions schema --- .circleci/config.yml | 24 +++++++++---------- packages/core-container/src/config/network.ts | 4 +++- packages/core-container/src/config/schema.ts | 6 ++--- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 86066c7200..64ad9c254e 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -86,8 +86,8 @@ jobs: name: core-container command: 'cd ~/ark-core/packages/core-container && yarn test:coverage' - run: - name: core-graphql - command: 'cd ~/ark-core/packages/core-graphql && yarn test:coverage' + name: core + command: 'cd ~/ark-core/packages/core && yarn test:coverage' - run: name: Last 1000 lines of test output when: on_fail @@ -181,8 +181,8 @@ jobs: name: core-container command: 'cd ~/ark-core/packages/core-container && yarn test:coverage' - run: - name: core-graphql - command: 'cd ~/ark-core/packages/core-graphql && yarn test:coverage' + name: core + command: 'cd ~/ark-core/packages/core && yarn test:coverage' - run: name: Last 1000 lines of test output when: on_fail @@ -344,8 +344,8 @@ jobs: name: core-logger-winston command: 'cd ~/ark-core/packages/core-logger-winston && yarn test:coverage' - run: - name: core-api - command: 'cd ~/ark-core/packages/core-api && yarn test:coverage' + name: core-graphql + command: 'cd ~/ark-core/packages/core-graphql && yarn test:coverage' - run: name: core-deployer command: 'cd ~/ark-core/packages/core-deployer && yarn test:coverage' @@ -353,8 +353,8 @@ jobs: name: core-database command: 'cd ~/ark-core/packages/core-database && yarn test:coverage' - run: - name: core - command: 'cd ~/ark-core/packages/core && yarn test:coverage' + name: core-api + command: 'cd ~/ark-core/packages/core-api && yarn test:coverage' - run: name: Last 1000 lines of test output when: on_fail @@ -605,8 +605,8 @@ jobs: name: core-logger-winston command: 'cd ~/ark-core/packages/core-logger-winston && yarn test:coverage' - run: - name: core-api - command: 'cd ~/ark-core/packages/core-api && yarn test:coverage' + name: core-graphql + command: 'cd ~/ark-core/packages/core-graphql && yarn test:coverage' - run: name: core-deployer command: 'cd ~/ark-core/packages/core-deployer && yarn test:coverage' @@ -614,8 +614,8 @@ jobs: name: core-database command: 'cd ~/ark-core/packages/core-database && yarn test:coverage' - run: - name: core - command: 'cd ~/ark-core/packages/core && yarn test:coverage' + name: core-api + command: 'cd ~/ark-core/packages/core-api && yarn test:coverage' - run: name: Last 1000 lines of test output when: on_fail diff --git a/packages/core-container/src/config/network.ts b/packages/core-container/src/config/network.ts index 619e54ecf5..f869819172 100644 --- a/packages/core-container/src/config/network.ts +++ b/packages/core-container/src/config/network.ts @@ -43,7 +43,9 @@ export class Network { if (error) { throw new Error( - "An invalid network configuration was provided or is inaccessible due to it's security settings.", + `An invalid network configuration was provided or is inaccessible due to it's security settings. ${ + error.message + }.`, ); } diff --git a/packages/core-container/src/config/schema.ts b/packages/core-container/src/config/schema.ts index 93778c637e..c33bf849e3 100644 --- a/packages/core-container/src/config/schema.ts +++ b/packages/core-container/src/config/schema.ts @@ -47,10 +47,8 @@ export const schemaNetwork = Joi.object({ .items(Joi.object()) .required(), exceptions: Joi.object({ - exceptions: Joi.object({ - blocks: Joi.array().items(Joi.string()), - transactions: Joi.array().items(Joi.string()), - }).required(), + blocks: Joi.array().items(Joi.string()), + transactions: Joi.array().items(Joi.string()), outlookTable: Joi.object(), transactionIdFixTable: Joi.object(), }).default({ exceptions: {} }), From a13645b8ca8aa7dcbed265b3af880aa951382413 Mon Sep 17 00:00:00 2001 From: Brian Faust Date: Mon, 17 Dec 2018 08:38:41 +0200 Subject: [PATCH 54/63] fix: map exceptions to crypto config manager --- .../core-container/__tests__/__stubs__/config/exceptions.json | 4 +--- packages/crypto/src/managers/config.ts | 3 ++- packages/crypto/src/networks/ark/testnet/exceptions.json | 4 +--- 3 files changed, 4 insertions(+), 7 deletions(-) diff --git a/packages/core-container/__tests__/__stubs__/config/exceptions.json b/packages/core-container/__tests__/__stubs__/config/exceptions.json index 8270ba5bdd..0967ef424b 100644 --- a/packages/core-container/__tests__/__stubs__/config/exceptions.json +++ b/packages/core-container/__tests__/__stubs__/config/exceptions.json @@ -1,3 +1 @@ -{ - "exceptions": {} -} +{} diff --git a/packages/crypto/src/managers/config.ts b/packages/crypto/src/managers/config.ts index 01874d9dc4..5c67c350ec 100644 --- a/packages/crypto/src/managers/config.ts +++ b/packages/crypto/src/managers/config.ts @@ -34,8 +34,9 @@ export class ConfigManager { this.config[key] = value; } - this.config.milestones = config.milestones; this.config.dynamicFees = config.dynamicFees; + this.config.exceptions = config.exceptions; + this.config.milestones = config.milestones; this.buildConstants(); this.buildFees(); diff --git a/packages/crypto/src/networks/ark/testnet/exceptions.json b/packages/crypto/src/networks/ark/testnet/exceptions.json index 8270ba5bdd..0967ef424b 100644 --- a/packages/crypto/src/networks/ark/testnet/exceptions.json +++ b/packages/crypto/src/networks/ark/testnet/exceptions.json @@ -1,3 +1 @@ -{ - "exceptions": {} -} +{} From cd34e05f5ef23a092826143a54a9b5e85d55b2c7 Mon Sep 17 00:00:00 2001 From: Brian Faust Date: Mon, 17 Dec 2018 08:46:43 +0200 Subject: [PATCH 55/63] test(crypto): expect exceptions to be available --- packages/crypto/__tests__/managers/config.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/crypto/__tests__/managers/config.test.ts b/packages/crypto/__tests__/managers/config.test.ts index 6cd93cfac6..ac25d776fc 100644 --- a/packages/crypto/__tests__/managers/config.test.ts +++ b/packages/crypto/__tests__/managers/config.test.ts @@ -18,7 +18,7 @@ describe("Configuration", () => { expect(configManager.all()).toContainAllKeys([ ...Object.keys(mainnet.network), - ...["milestones", "dynamicFees"], + ...["milestones", "dynamicFees", "exceptions"], ]); }); From 3b4876012b191240927308e4dd57fa77ee9f6c7f Mon Sep 17 00:00:00 2001 From: Brian Faust Date: Mon, 17 Dec 2018 14:29:47 +0200 Subject: [PATCH 56/63] refactor: simplify the crypto configuration --- .../config/loaders/remote-loader.test.ts | 2 +- packages/core-container/src/config/network.ts | 4 ++-- .../__tests__/builder/genesis-block.test.ts | 2 +- packages/core-deployer/src/index.ts | 2 +- .../core-forger/__tests__/manager.test.ts | 2 +- .../server/versions/config/handlers/index.ts | 2 +- .../src/fixtures/testnet/delegates.ts | 2 +- .../generators/transactions/transaction.ts | 2 +- .../core-test-utils/src/generators/wallets.ts | 2 +- packages/core/src/index.ts | 3 +-- packages/crypto/__tests__/constants.test.ts | 11 ----------- .../crypto/__tests__/crypto/crypto.test.ts | 19 +++++++++++-------- .../crypto/__tests__/crypto/hdwallet.test.ts | 2 +- .../crypto/__tests__/crypto/slots.test.ts | 2 +- .../crypto/__tests__/managers/config.test.ts | 2 +- .../crypto/__tests__/managers/network.test.ts | 2 +- .../crypto/__tests__/models/block.test.ts | 4 ++-- .../crypto/__tests__/models/delegate.test.ts | 2 +- .../__tests__/models/transaction.test.ts | 2 +- .../crypto/__tests__/models/wallet.test.ts | 2 +- packages/crypto/src/constants.ts | 14 -------------- packages/crypto/src/crypto/crypto.ts | 3 +-- packages/crypto/src/managers/config.ts | 16 +++++++--------- packages/crypto/src/managers/network.ts | 4 ++-- packages/crypto/src/models/block.ts | 3 +-- packages/crypto/src/models/transaction.ts | 4 ++-- packages/crypto/src/networks/ark/index.ts | 6 ------ .../src/networks/{ark => }/bitcoin/index.ts | 0 .../networks/{ark => }/bitcoin/network.json | 0 .../{ark => }/devnet/dynamicFees.json | 0 .../networks/{ark => }/devnet/exceptions.json | 0 .../src/networks/{ark => }/devnet/index.ts | 0 .../networks/{ark => }/devnet/milestones.json | 0 .../networks/{ark => }/devnet/network.json | 0 packages/crypto/src/networks/index.ts | 6 ++++-- .../{ark => }/mainnet/dynamicFees.json | 0 .../{ark => }/mainnet/exceptions.json | 0 .../src/networks/{ark => }/mainnet/index.ts | 0 .../{ark => }/mainnet/milestones.json | 0 .../networks/{ark => }/mainnet/network.json | 0 .../{ark => }/testnet/dynamicFees.json | 0 .../{ark => }/testnet/exceptions.json | 0 .../src/networks/{ark => }/testnet/index.ts | 0 .../{ark => }/testnet/milestones.json | 0 .../networks/{ark => }/testnet/network.json | 0 45 files changed, 48 insertions(+), 79 deletions(-) delete mode 100644 packages/crypto/src/networks/ark/index.ts rename packages/crypto/src/networks/{ark => }/bitcoin/index.ts (100%) rename packages/crypto/src/networks/{ark => }/bitcoin/network.json (100%) rename packages/crypto/src/networks/{ark => }/devnet/dynamicFees.json (100%) rename packages/crypto/src/networks/{ark => }/devnet/exceptions.json (100%) rename packages/crypto/src/networks/{ark => }/devnet/index.ts (100%) rename packages/crypto/src/networks/{ark => }/devnet/milestones.json (100%) rename packages/crypto/src/networks/{ark => }/devnet/network.json (100%) rename packages/crypto/src/networks/{ark => }/mainnet/dynamicFees.json (100%) rename packages/crypto/src/networks/{ark => }/mainnet/exceptions.json (100%) rename packages/crypto/src/networks/{ark => }/mainnet/index.ts (100%) rename packages/crypto/src/networks/{ark => }/mainnet/milestones.json (100%) rename packages/crypto/src/networks/{ark => }/mainnet/network.json (100%) rename packages/crypto/src/networks/{ark => }/testnet/dynamicFees.json (100%) rename packages/crypto/src/networks/{ark => }/testnet/exceptions.json (100%) rename packages/crypto/src/networks/{ark => }/testnet/index.ts (100%) rename packages/crypto/src/networks/{ark => }/testnet/milestones.json (100%) rename packages/crypto/src/networks/{ark => }/testnet/network.json (100%) diff --git a/packages/core-container/__tests__/config/loaders/remote-loader.test.ts b/packages/core-container/__tests__/config/loaders/remote-loader.test.ts index f62c77295e..7033b2eaf0 100644 --- a/packages/core-container/__tests__/config/loaders/remote-loader.test.ts +++ b/packages/core-container/__tests__/config/loaders/remote-loader.test.ts @@ -48,7 +48,7 @@ describe.skip("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/src/config/network.ts b/packages/core-container/src/config/network.ts index f869819172..87e404ace6 100644 --- a/packages/core-container/src/config/network.ts +++ b/packages/core-container/src/config/network.ts @@ -14,8 +14,8 @@ export class Network { let config; // Default configuration... - if (opts.token && opts.network) { - config = NetworkManager.findByName(opts.network, opts.token); + if (opts.network) { + config = NetworkManager.findByName(opts.network); // Default configuration + Custom dynamic fees... const dynamicFees = resolve(expandHomeDir(`${process.env.ARK_PATH_CONFIG}/dynamicFees.json`)); diff --git a/packages/core-deployer/__tests__/builder/genesis-block.test.ts b/packages/core-deployer/__tests__/builder/genesis-block.test.ts index 8587f24cf2..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 { testnet } from "../../../crypto/src/networks/ark"; +import { testnet } from "../../../crypto/src/networks"; import { GenesisBlockBuilder } from "../../src/builder/genesis-block"; let builder; diff --git a/packages/core-deployer/src/index.ts b/packages/core-deployer/src/index.ts index 96f609a9af..d4d46b1281 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); 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-p2p/src/server/versions/config/handlers/index.ts b/packages/core-p2p/src/server/versions/config/handlers/index.ts index 4fffbdb0d4..def09b0bc0 100644 --- a/packages/core-p2p/src/server/versions/config/handlers/index.ts +++ b/packages/core-p2p/src/server/versions/config/handlers/index.ts @@ -40,7 +40,7 @@ export const dynamicFees = { const networkName = appConfig.get("network.name"); return { - data: require(`../../../../../../crypto/src/networks/ark/${networkName}/dynamicFees.json`), + data: require(`../../../../../../crypto/src/networks/${networkName}/dynamicFees.json`), }; }, }; 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/transaction.ts b/packages/core-test-utils/src/generators/transactions/transaction.ts index eb97559363..1a5d3c4502 100644 --- a/packages/core-test-utils/src/generators/transactions/transaction.ts +++ b/packages/core-test-utils/src/generators/transactions/transaction.ts @@ -33,7 +33,7 @@ export const generateTransaction = ( passphrase = passphrase[0]; } - client.getConfigManager().setFromPreset("ark", network); + client.getConfigManager().setFromPreset(network); const transactions = []; for (let i = 0; i < quantity; i++) { 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/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__/constants.test.ts b/packages/crypto/__tests__/constants.test.ts index c2f8b6a632..4373fde4ae 100644 --- a/packages/crypto/__tests__/constants.test.ts +++ b/packages/crypto/__tests__/constants.test.ts @@ -38,15 +38,4 @@ describe("Constants", () => { 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(); - }); }); diff --git a/packages/crypto/__tests__/crypto/crypto.test.ts b/packages/crypto/__tests__/crypto/crypto.test.ts index 477615ba37..dfd64d80d2 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 { TRANSACTION_TYPES } 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", () => { @@ -239,9 +242,9 @@ describe("crypto.js", () => { it("should get address from compressed WIF (mainnet)", () => { const keys = crypto.getKeysFromWIF( "SAaaKsDdWMXP5BoVnSBLwTLn48n96UvG42WSUUooRv1HrEHmaSd4", - CONFIGURATIONS.ARK.MAINNET.network, + networkMainnet.network, ); - const address = crypto.getAddress(keys.publicKey, CONFIGURATIONS.ARK.MAINNET.network.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.network, + networkDevnet.network, ); - const address = crypto.getAddress(keys.publicKey, CONFIGURATIONS.ARK.DEVNET.network.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 7c2b7d388e..6fba33be27 100644 --- a/packages/crypto/__tests__/crypto/hdwallet.test.ts +++ b/packages/crypto/__tests__/crypto/hdwallet.test.ts @@ -3,7 +3,7 @@ import "jest-extended"; import bip32 from "bip32"; import { crypto, HDWallet } from "../../src/crypto"; import { configManager } from "../../src/managers/config"; -import { mainnet } from "../../src/networks/ark"; +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"; diff --git a/packages/crypto/__tests__/crypto/slots.test.ts b/packages/crypto/__tests__/crypto/slots.test.ts index 044a44cbc6..6ce829c9b2 100644 --- a/packages/crypto/__tests__/crypto/slots.test.ts +++ b/packages/crypto/__tests__/crypto/slots.test.ts @@ -2,7 +2,7 @@ import "jest-extended"; import { slots } from "../../src/crypto/slots"; import { configManager } from "../../src/managers/config"; -import { devnet } from "../../src/networks/ark"; +import { devnet } from "../../src/networks"; beforeEach(() => configManager.setConfig(devnet)); diff --git a/packages/crypto/__tests__/managers/config.test.ts b/packages/crypto/__tests__/managers/config.test.ts index ac25d776fc..8c5484254e 100644 --- a/packages/crypto/__tests__/managers/config.test.ts +++ b/packages/crypto/__tests__/managers/config.test.ts @@ -4,7 +4,7 @@ import { TRANSACTION_TYPES } from "../../src/constants"; import { configManager } from "../../src/managers/config"; import { dynamicFeeManager } from "../../src/managers/dynamic-fee"; import { feeManager } from "../../src/managers/fee"; -import { devnet, mainnet } from "../../src/networks/ark"; +import { devnet, mainnet } from "../../src/networks"; beforeEach(() => configManager.setConfig(devnet)); diff --git a/packages/crypto/__tests__/managers/network.test.ts b/packages/crypto/__tests__/managers/network.test.ts index 51d99a3bc4..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 { mainnet } from "../../src/networks/ark"; +import { mainnet } from "../../src/networks"; describe("Network Manager", () => { it("should be instantiated", () => { diff --git a/packages/crypto/__tests__/models/block.test.ts b/packages/crypto/__tests__/models/block.test.ts index fd51ceb090..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.exceptions; +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 913c33b318..a6d891e0ca 100644 --- a/packages/crypto/__tests__/models/delegate.test.ts +++ b/packages/crypto/__tests__/models/delegate.test.ts @@ -6,7 +6,7 @@ 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"; diff --git a/packages/crypto/__tests__/models/transaction.test.ts b/packages/crypto/__tests__/models/transaction.test.ts index bb887bfbd2..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 { devnet } from "../../src/networks/ark"; +import { devnet } from "../../src/networks"; const createRandomTx = type => { let transaction; diff --git a/packages/crypto/__tests__/models/wallet.test.ts b/packages/crypto/__tests__/models/wallet.test.ts index 746900ffce..ad7a55c624 100644 --- a/packages/crypto/__tests__/models/wallet.test.ts +++ b/packages/crypto/__tests__/models/wallet.test.ts @@ -5,7 +5,7 @@ import { configManager } from "../../src/managers/config"; import { Wallet } from "../../src/models/wallet"; import { Bignum } from "../../src/utils/bignum"; -import { devnet } from "../../src/networks/ark"; +import { devnet } from "../../src/networks"; import { multiTransaction } from "./fixtures/multi-transaction"; describe("Models - Wallet", () => { diff --git a/packages/crypto/src/constants.ts b/packages/crypto/src/constants.ts index 856537c4e1..839c3b0385 100644 --- a/packages/crypto/src/constants.ts +++ b/packages/crypto/src/constants.ts @@ -1,5 +1,3 @@ -import { devnet, mainnet, testnet } from "./networks/ark"; - /** * The Arktoshi base. * @type {Number} @@ -45,15 +43,3 @@ export const TRANSACTION_TYPES = Object.freeze({ } }, }); - -/** - * Available network configurations. - * @type {Object} - */ -export const CONFIGURATIONS = Object.freeze({ - ARK: { - MAINNET: mainnet, - DEVNET: devnet, - TESTNET: testnet, - }, -}); diff --git a/packages/crypto/src/crypto/crypto.ts b/packages/crypto/src/crypto/crypto.ts index 8e54cb07c7..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.exceptions; +const { transactionIdFixTable } = configManager.getPreset("mainnet").exceptions; class Crypto { /** diff --git a/packages/crypto/src/managers/config.ts b/packages/crypto/src/managers/config.ts index 5c67c350ec..fcab453083 100644 --- a/packages/crypto/src/managers/config.ts +++ b/packages/crypto/src/managers/config.ts @@ -5,8 +5,8 @@ import set from "lodash/set"; import { dynamicFeeManager } from "./dynamic-fee"; import { feeManager } from "./fee"; -import { CONFIGURATIONS, TRANSACTION_TYPES } from "../constants"; -import { devnet } from "../networks/ark"; +import { TRANSACTION_TYPES } from "../constants"; +import * as networks from "../networks"; export class ConfigManager { public config: any; @@ -19,7 +19,7 @@ export class ConfigManager { * @constructor */ constructor() { - this.setConfig(devnet); + this.setConfig(networks.devnet); } /** @@ -45,21 +45,19 @@ export class ConfigManager { /** * Set the configuration based on a preset. - * @param {String} token * @param {String} network */ - public setFromPreset(token, network) { - this.setConfig(this.getPreset(token, network)); + public setFromPreset(network: string) { + this.setConfig(this.getPreset(network)); } /** * Get the configuration for a preset. - * @param {String} token * @param {String} network * @return {Object} */ - public getPreset(token, network) { - return CONFIGURATIONS[token.toUpperCase()][network.toUpperCase()]; + public getPreset(network: string) { + return networks[network.toLowerCase()]; } /** 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 a4179bee31..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.exceptions; +const { outlookTable } = configManager.getPreset("mainnet").exceptions; const toBytesHex = data => { const temp = data ? new Bignum(data).toString(16) : ""; diff --git a/packages/crypto/src/models/transaction.ts b/packages/crypto/src/models/transaction.ts index 106c2d4f2a..f865598efe 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 { TRANSACTION_TYPES } from "../constants"; import { crypto } from "../crypto/crypto"; import { configManager } from "../managers/config"; import { Bignum } from "../utils"; -const { transactionIdFixTable } = CONFIGURATIONS.ARK.MAINNET.exceptions; +const { transactionIdFixTable } = configManager.getPreset("mainnet").exceptions; /** * TODO copy some parts to ArkDocs diff --git a/packages/crypto/src/networks/ark/index.ts b/packages/crypto/src/networks/ark/index.ts deleted file mode 100644 index b7a9ebd2f4..0000000000 --- a/packages/crypto/src/networks/ark/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { bitcoin } from "./bitcoin"; -import { devnet } from "./devnet"; -import { mainnet } from "./mainnet"; -import { testnet } from "./testnet"; - -export { bitcoin, devnet, mainnet, testnet }; diff --git a/packages/crypto/src/networks/ark/bitcoin/index.ts b/packages/crypto/src/networks/bitcoin/index.ts similarity index 100% rename from packages/crypto/src/networks/ark/bitcoin/index.ts rename to packages/crypto/src/networks/bitcoin/index.ts diff --git a/packages/crypto/src/networks/ark/bitcoin/network.json b/packages/crypto/src/networks/bitcoin/network.json similarity index 100% rename from packages/crypto/src/networks/ark/bitcoin/network.json rename to packages/crypto/src/networks/bitcoin/network.json diff --git a/packages/crypto/src/networks/ark/devnet/dynamicFees.json b/packages/crypto/src/networks/devnet/dynamicFees.json similarity index 100% rename from packages/crypto/src/networks/ark/devnet/dynamicFees.json rename to packages/crypto/src/networks/devnet/dynamicFees.json diff --git a/packages/crypto/src/networks/ark/devnet/exceptions.json b/packages/crypto/src/networks/devnet/exceptions.json similarity index 100% rename from packages/crypto/src/networks/ark/devnet/exceptions.json rename to packages/crypto/src/networks/devnet/exceptions.json diff --git a/packages/crypto/src/networks/ark/devnet/index.ts b/packages/crypto/src/networks/devnet/index.ts similarity index 100% rename from packages/crypto/src/networks/ark/devnet/index.ts rename to packages/crypto/src/networks/devnet/index.ts diff --git a/packages/crypto/src/networks/ark/devnet/milestones.json b/packages/crypto/src/networks/devnet/milestones.json similarity index 100% rename from packages/crypto/src/networks/ark/devnet/milestones.json rename to packages/crypto/src/networks/devnet/milestones.json diff --git a/packages/crypto/src/networks/ark/devnet/network.json b/packages/crypto/src/networks/devnet/network.json similarity index 100% rename from packages/crypto/src/networks/ark/devnet/network.json rename to packages/crypto/src/networks/devnet/network.json 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/ark/mainnet/dynamicFees.json b/packages/crypto/src/networks/mainnet/dynamicFees.json similarity index 100% rename from packages/crypto/src/networks/ark/mainnet/dynamicFees.json rename to packages/crypto/src/networks/mainnet/dynamicFees.json diff --git a/packages/crypto/src/networks/ark/mainnet/exceptions.json b/packages/crypto/src/networks/mainnet/exceptions.json similarity index 100% rename from packages/crypto/src/networks/ark/mainnet/exceptions.json rename to packages/crypto/src/networks/mainnet/exceptions.json diff --git a/packages/crypto/src/networks/ark/mainnet/index.ts b/packages/crypto/src/networks/mainnet/index.ts similarity index 100% rename from packages/crypto/src/networks/ark/mainnet/index.ts rename to packages/crypto/src/networks/mainnet/index.ts diff --git a/packages/crypto/src/networks/ark/mainnet/milestones.json b/packages/crypto/src/networks/mainnet/milestones.json similarity index 100% rename from packages/crypto/src/networks/ark/mainnet/milestones.json rename to packages/crypto/src/networks/mainnet/milestones.json diff --git a/packages/crypto/src/networks/ark/mainnet/network.json b/packages/crypto/src/networks/mainnet/network.json similarity index 100% rename from packages/crypto/src/networks/ark/mainnet/network.json rename to packages/crypto/src/networks/mainnet/network.json diff --git a/packages/crypto/src/networks/ark/testnet/dynamicFees.json b/packages/crypto/src/networks/testnet/dynamicFees.json similarity index 100% rename from packages/crypto/src/networks/ark/testnet/dynamicFees.json rename to packages/crypto/src/networks/testnet/dynamicFees.json diff --git a/packages/crypto/src/networks/ark/testnet/exceptions.json b/packages/crypto/src/networks/testnet/exceptions.json similarity index 100% rename from packages/crypto/src/networks/ark/testnet/exceptions.json rename to packages/crypto/src/networks/testnet/exceptions.json diff --git a/packages/crypto/src/networks/ark/testnet/index.ts b/packages/crypto/src/networks/testnet/index.ts similarity index 100% rename from packages/crypto/src/networks/ark/testnet/index.ts rename to packages/crypto/src/networks/testnet/index.ts diff --git a/packages/crypto/src/networks/ark/testnet/milestones.json b/packages/crypto/src/networks/testnet/milestones.json similarity index 100% rename from packages/crypto/src/networks/ark/testnet/milestones.json rename to packages/crypto/src/networks/testnet/milestones.json diff --git a/packages/crypto/src/networks/ark/testnet/network.json b/packages/crypto/src/networks/testnet/network.json similarity index 100% rename from packages/crypto/src/networks/ark/testnet/network.json rename to packages/crypto/src/networks/testnet/network.json From 7f835fca4f447ed44776856041e37c763d8aed25 Mon Sep 17 00:00:00 2001 From: Brian Faust Date: Mon, 17 Dec 2018 14:31:52 +0200 Subject: [PATCH 57/63] chore(crypto): remove unused bitcoin network --- packages/crypto/src/networks/bitcoin/index.ts | 3 --- packages/crypto/src/networks/bitcoin/network.json | 10 ---------- 2 files changed, 13 deletions(-) delete mode 100644 packages/crypto/src/networks/bitcoin/index.ts delete mode 100644 packages/crypto/src/networks/bitcoin/network.json diff --git a/packages/crypto/src/networks/bitcoin/index.ts b/packages/crypto/src/networks/bitcoin/index.ts deleted file mode 100644 index 8d2f1ee23f..0000000000 --- a/packages/crypto/src/networks/bitcoin/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import network from "./network.json"; - -export const bitcoin = { network }; diff --git a/packages/crypto/src/networks/bitcoin/network.json b/packages/crypto/src/networks/bitcoin/network.json deleted file mode 100644 index 0625e01320..0000000000 --- a/packages/crypto/src/networks/bitcoin/network.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "name": "bitcoin", - "messagePrefix": "\u0018Bitcoin Signed Message:\n", - "bip32": { - "public": 76067358, - "private": 76066276 - }, - "pubKeyHash": 0, - "wif": 128 -} From 3d869d43f81d28dfbab8c48b82289d8759f071f9 Mon Sep 17 00:00:00 2001 From: Brian Faust Date: Mon, 17 Dec 2018 15:02:14 +0200 Subject: [PATCH 58/63] refactor: move dynamic fees into the transaction pool --- .../config/loaders/file-loader.test.ts | 1 - packages/core-container/src/config/index.ts | 1 - .../src/config/loaders/remote-loader.ts | 10 --- packages/core-container/src/config/network.ts | 8 -- packages/core-container/src/config/schema.ts | 42 ---------- packages/core-deployer/src/index.ts | 16 ---- .../server/versions/config/handlers/index.ts | 10 --- .../src/server/versions/config/index.ts | 1 - .../__tests__/dynamic-fee.test.ts | 9 ++- packages/core-transaction-pool/src/config.ts | 20 +++++ .../core-transaction-pool/src/defaults.ts | 16 ++++ .../src/dynamic-fee/index.ts | 4 + .../src/dynamic-fee/manager.ts | 77 +++++++++++++++++++ .../matcher.ts} | 8 +- packages/core-transaction-pool/src/guard.ts | 2 +- packages/core-transaction-pool/src/index.ts | 9 ++- .../crypto/__tests__/managers/config.test.ts | 16 +--- .../crypto/__tests__/models/delegate.test.ts | 2 - packages/crypto/src/managers/config.ts | 12 --- packages/crypto/src/networks/devnet/index.ts | 3 +- packages/crypto/src/networks/mainnet/index.ts | 3 +- packages/crypto/src/networks/testnet/index.ts | 3 +- 22 files changed, 139 insertions(+), 134 deletions(-) create mode 100644 packages/core-transaction-pool/src/config.ts create mode 100644 packages/core-transaction-pool/src/dynamic-fee/index.ts create mode 100644 packages/core-transaction-pool/src/dynamic-fee/manager.ts rename packages/core-transaction-pool/src/{utils/dynamicfee-matcher.ts => dynamic-fee/matcher.ts} (92%) diff --git a/packages/core-container/__tests__/config/loaders/file-loader.test.ts b/packages/core-container/__tests__/config/loaders/file-loader.test.ts index 675878cfe3..7826d82b13 100644 --- a/packages/core-container/__tests__/config/loaders/file-loader.test.ts +++ b/packages/core-container/__tests__/config/loaders/file-loader.test.ts @@ -8,7 +8,6 @@ const stubConfigPath = resolve(__dirname, "../../__stubs__/config"); const stubConfig = { delegates: require(resolve(__dirname, "../../__stubs__/config/delegates")), - dynamicFees: require(resolve(__dirname, "../../__stubs__/config/dynamicFees")), exceptions: require(resolve(__dirname, "../../__stubs__/config/exceptions")), genesisBlock: require(resolve(__dirname, "../../__stubs__/config/genesisBlock")), milestones: require(resolve(__dirname, "../../__stubs__/config/milestones")), diff --git a/packages/core-container/src/config/index.ts b/packages/core-container/src/config/index.ts index 708c9be2c2..8204b7acbb 100644 --- a/packages/core-container/src/config/index.ts +++ b/packages/core-container/src/config/index.ts @@ -53,7 +53,6 @@ class Config { crypto.setConfig(value); this.config.network = crypto.all(); - this.config.dynamicFees = crypto.get("dynamicFees"); this.config.exceptions = crypto.get("exceptions"); this.config.milestones = crypto.get("milestones"); } diff --git a/packages/core-container/src/config/loaders/remote-loader.ts b/packages/core-container/src/config/loaders/remote-loader.ts index 9a3c3aebd4..2008c96d47 100644 --- a/packages/core-container/src/config/loaders/remote-loader.ts +++ b/packages/core-container/src/config/loaders/remote-loader.ts @@ -19,8 +19,6 @@ export class RemoteLoader { public async setUp() { const network = await this.configureNetwork(); - await this.configureDynamicFees(); - await this.configureExceptions(); await this.configureMilestones(); @@ -44,14 +42,6 @@ export class RemoteLoader { return network; } - private async configureDynamicFees() { - const dynamicFees = await this.getConfig("dynamicFees"); - - this.writeConfig("dynamicFees", dynamicFees); - - return dynamicFees; - } - private async configureExceptions() { const exceptions = await this.getConfig("exceptions"); diff --git a/packages/core-container/src/config/network.ts b/packages/core-container/src/config/network.ts index 87e404ace6..357bb10cbd 100644 --- a/packages/core-container/src/config/network.ts +++ b/packages/core-container/src/config/network.ts @@ -16,19 +16,11 @@ export class Network { // Default configuration... if (opts.network) { config = NetworkManager.findByName(opts.network); - - // Default configuration + Custom dynamic fees... - const dynamicFees = resolve(expandHomeDir(`${process.env.ARK_PATH_CONFIG}/dynamicFees.json`)); - - if (existsSync(dynamicFees)) { - config.dynamicFees = require(dynamicFees); - } } else { try { const networkPath = resolve(expandHomeDir(process.env.ARK_PATH_CONFIG)); config = { - dynamicFees: require(`${networkPath}/dynamicFees`), exceptions: require(`${networkPath}/exceptions`), milestones: require(`${networkPath}/milestones`), network: require(`${networkPath}/network`), diff --git a/packages/core-container/src/config/schema.ts b/packages/core-container/src/config/schema.ts index c33bf849e3..2ee5bc4020 100644 --- a/packages/core-container/src/config/schema.ts +++ b/packages/core-container/src/config/schema.ts @@ -1,48 +1,6 @@ import Joi from "joi"; export const schemaNetwork = Joi.object({ - dynamicFees: Joi.object({ - enabled: Joi.boolean().required(), - minFeePool: Joi.number() - .integer() - .positive() - .required(), - minFeeBroadcast: Joi.number() - .integer() - .positive() - .required(), - addonBytes: Joi.object() - .keys({ - transfer: Joi.number() - .integer() - .required(), - secondSignature: Joi.number() - .integer() - .required(), - delegateRegistration: Joi.number() - .integer() - .required(), - vote: Joi.number() - .integer() - .required(), - multiSignature: Joi.number() - .integer() - .required(), - ipfs: Joi.number() - .integer() - .required(), - timelockTransfer: Joi.number() - .integer() - .required(), - multiPayment: Joi.number() - .integer() - .required(), - delegateResignation: Joi.number() - .integer() - .required(), - }) - .required(), - }).required(), milestones: Joi.array() .items(Joi.object()) .required(), diff --git a/packages/core-deployer/src/index.ts b/packages/core-deployer/src/index.ts index d4d46b1281..892f7b25cb 100644 --- a/packages/core-deployer/src/index.ts +++ b/packages/core-deployer/src/index.ts @@ -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-p2p/src/server/versions/config/handlers/index.ts b/packages/core-p2p/src/server/versions/config/handlers/index.ts index def09b0bc0..3a04fbbeec 100644 --- a/packages/core-p2p/src/server/versions/config/handlers/index.ts +++ b/packages/core-p2p/src/server/versions/config/handlers/index.ts @@ -35,16 +35,6 @@ export const network = { }, }; -export const dynamicFees = { - handler(request, h) { - const networkName = appConfig.get("network.name"); - - return { - data: require(`../../../../../../crypto/src/networks/${networkName}/dynamicFees.json`), - }; - }, -}; - export const exceptions = { 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 1344f8058b..ab7fc862a5 100644 --- a/packages/core-p2p/src/server/versions/config/index.ts +++ b/packages/core-p2p/src/server/versions/config/index.ts @@ -9,7 +9,6 @@ const register = async (server, options) => { server.route([ { method: "GET", path: "/", ...handlers.config }, { method: "GET", path: "/network", ...handlers.network }, - { method: "GET", path: "/dynamicFees", ...handlers.dynamicFees }, { method: "GET", path: "/exceptions", ...handlers.exceptions }, { method: "GET", path: "/milestones", ...handlers.milestones }, { method: "GET", path: "/genesis-block", ...handlers.genesisBlock }, diff --git a/packages/core-transaction-pool/__tests__/dynamic-fee.test.ts b/packages/core-transaction-pool/__tests__/dynamic-fee.test.ts index ef5e874dcb..e7e14b092b 100644 --- a/packages/core-transaction-pool/__tests__/dynamic-fee.test.ts +++ b/packages/core-transaction-pool/__tests__/dynamic-fee.test.ts @@ -1,5 +1,4 @@ -import { configManager } from "@arkecosystem/crypto"; -import { dynamicFeeMatcher } from "../src/utils/dynamicfee-matcher"; +import { dynamicFeeMatcher } from "../src/dynamic-fee/matcher"; import { transactions } from "./__fixtures__/transactions"; import { setUpFull, tearDown } from "./__support__/setup"; @@ -22,8 +21,9 @@ describe("static fees", () => { height: 20, }, })); + const h = blockchain.getLastBlock().data.height; - configManager.set("dynamicFees.enabled", false); + container.resolvePlugin("transactionPool").config.set("dynamicFees.enabled", false); }); it("should accept transactions matching the static fee for broadcast", () => { @@ -55,8 +55,9 @@ describe("dynamic fees", () => { height: 20, }, })); + const h = blockchain.getLastBlock().data.height; - configManager.set("dynamicFees.enabled", true); + container.resolvePlugin("transactionPool").config.set("dynamicFees.enabled", true); }); it("should broadcast transactions with high enough fee", () => { 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/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..f9cd7482e1 --- /dev/null +++ b/packages/core-transaction-pool/src/dynamic-fee/index.ts @@ -0,0 +1,4 @@ +import { dynamicFeeManager } from "./manager"; +import { dynamicFeeMatcher } from "./matcher"; + +export { dynamicFeeManager, dynamicFeeMatcher }; diff --git a/packages/core-transaction-pool/src/dynamic-fee/manager.ts b/packages/core-transaction-pool/src/dynamic-fee/manager.ts new file mode 100644 index 0000000000..6cccad3cbd --- /dev/null +++ b/packages/core-transaction-pool/src/dynamic-fee/manager.ts @@ -0,0 +1,77 @@ +import { constants } from "@arkecosystem/crypto"; +import camelCase from "lodash/camelCase"; +import { config as localConfig } from "../config"; + +const { TRANSACTION_TYPES } = constants; + +class DynamicFeeManager { + public offsets: {}; + + /** + * @constructor + */ + constructor() { + this.offsets = {}; + } + + /** + * @constructor + */ + public init() { + const addonBytes = localConfig.get("dynamicFees").addonBytes; + + for (const type of Object.keys(TRANSACTION_TYPES)) { + this.set(TRANSACTION_TYPES[type], addonBytes[camelCase(type)]); + } + } + + /** + * 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; + } +} + +export const dynamicFeeManager = new DynamicFeeManager(); diff --git a/packages/core-transaction-pool/src/utils/dynamicfee-matcher.ts b/packages/core-transaction-pool/src/dynamic-fee/matcher.ts similarity index 92% rename from packages/core-transaction-pool/src/utils/dynamicfee-matcher.ts rename to packages/core-transaction-pool/src/dynamic-fee/matcher.ts index b92679a73a..ed2badfe63 100644 --- a/packages/core-transaction-pool/src/utils/dynamicfee-matcher.ts +++ b/packages/core-transaction-pool/src/dynamic-fee/matcher.ts @@ -1,5 +1,7 @@ import { app } from "@arkecosystem/core-container"; -import { configManager, dynamicFeeManager, feeManager, formatArktoshi } from "@arkecosystem/crypto"; +import { feeManager, formatArktoshi } from "@arkecosystem/crypto"; +import { config as localConfig } from "../config"; +import { dynamicFeeManager } from "../dynamic-fee"; /** * Determine if a transaction's fee meets the minimum requirements for broadcasting @@ -13,14 +15,14 @@ export function dynamicFeeMatcher(transaction) { const fee = +transaction.fee.toFixed(); const id = transaction.id; - const blockchain = app.resolvePlugin("blockchain"); - const dynamicFees = configManager.get("dynamicFees"); + const dynamicFees = localConfig.get("dynamicFees"); let broadcast; let enterPool; if (dynamicFees.enabled) { const minFeeBroadcast = dynamicFeeManager.calculateFee(dynamicFees.minFeeBroadcast, transaction); + if (fee >= minFeeBroadcast) { broadcast = true; logger.debug( diff --git a/packages/core-transaction-pool/src/guard.ts b/packages/core-transaction-pool/src/guard.ts index 86d9a722bc..6cc85da398 100644 --- a/packages/core-transaction-pool/src/guard.ts +++ b/packages/core-transaction-pool/src/guard.ts @@ -5,7 +5,7 @@ import pluralize from "pluralize"; const { TRANSACTION_TYPES } = 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 { diff --git a/packages/core-transaction-pool/src/index.ts b/packages/core-transaction-pool/src/index.ts index 0ef33af36d..07a6394de1 100644 --- a/packages/core-transaction-pool/src/index.ts +++ b/packages/core-transaction-pool/src/index.ts @@ -1,5 +1,7 @@ +import { config } from "./config"; import { TransactionPool } from "./connection"; import { defaults } from "./defaults"; +import { dynamicFeeManager } from "./dynamic-fee"; import { transactionPoolManager } from "./manager"; /** @@ -11,13 +13,16 @@ const plugin = { defaults, alias: "transactionPool", async register(container, options) { + config.init(options); + + dynamicFeeManager.init(); + 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 +36,4 @@ const plugin = { */ import { TransactionGuard } from "./guard"; -export { plugin, TransactionPool, TransactionGuard }; +export { config, plugin, TransactionPool, TransactionGuard }; diff --git a/packages/crypto/__tests__/managers/config.test.ts b/packages/crypto/__tests__/managers/config.test.ts index 8c5484254e..49a050aba4 100644 --- a/packages/crypto/__tests__/managers/config.test.ts +++ b/packages/crypto/__tests__/managers/config.test.ts @@ -18,7 +18,7 @@ describe("Configuration", () => { expect(configManager.all()).toContainAllKeys([ ...Object.keys(mainnet.network), - ...["milestones", "dynamicFees", "exceptions"], + ...["milestones", "exceptions"], ]); }); @@ -50,20 +50,6 @@ describe("Configuration", () => { expect(feeManager.get(TRANSACTION_TYPES.DELEGATE_RESIGNATION)).toEqual(feesStatic.delegateResignation); }); - it("should build dynamic fee offsets", () => { - const addonBytes = devnet.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 milestone for height", () => { expect(configManager.getMilestone(21600)).toEqual(devnet.milestones[2]); }); diff --git a/packages/crypto/__tests__/models/delegate.test.ts b/packages/crypto/__tests__/models/delegate.test.ts index a6d891e0ca..f13774c6a7 100644 --- a/packages/crypto/__tests__/models/delegate.test.ts +++ b/packages/crypto/__tests__/models/delegate.test.ts @@ -1,8 +1,6 @@ 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"; diff --git a/packages/crypto/src/managers/config.ts b/packages/crypto/src/managers/config.ts index fcab453083..2f328818f2 100644 --- a/packages/crypto/src/managers/config.ts +++ b/packages/crypto/src/managers/config.ts @@ -13,7 +13,6 @@ export class ConfigManager { public height: any; public milestone: any; public milestones: any; - public dynamicFees: any; /** * @constructor @@ -34,13 +33,11 @@ export class ConfigManager { this.config[key] = value; } - this.config.dynamicFees = config.dynamicFees; this.config.exceptions = config.exceptions; this.config.milestones = config.milestones; this.buildConstants(); this.buildFees(); - this.buildAddonBytes(); } /** @@ -158,15 +155,6 @@ export class ConfigManager { feeManager.set(TRANSACTION_TYPES[type], this.getMilestone().fees.staticFees[camelCase(type)]); } } - - /** - * Build addon bytes from config constants. - */ - private buildAddonBytes() { - for (const type of Object.keys(TRANSACTION_TYPES)) { - dynamicFeeManager.set(TRANSACTION_TYPES[type], this.config.dynamicFees.addonBytes[camelCase(type)]); - } - } } export const configManager = new ConfigManager(); diff --git a/packages/crypto/src/networks/devnet/index.ts b/packages/crypto/src/networks/devnet/index.ts index aabd1a2482..76fc792b63 100644 --- a/packages/crypto/src/networks/devnet/index.ts +++ b/packages/crypto/src/networks/devnet/index.ts @@ -1,6 +1,5 @@ -import dynamicFees from "./dynamicFees.json"; import exceptions from "./exceptions.json"; import milestones from "./milestones.json"; import network from "./network.json"; -export const devnet = { dynamicFees, exceptions, milestones, network }; +export const devnet = { exceptions, milestones, network }; diff --git a/packages/crypto/src/networks/mainnet/index.ts b/packages/crypto/src/networks/mainnet/index.ts index 7e71f7eec7..f880959ca5 100644 --- a/packages/crypto/src/networks/mainnet/index.ts +++ b/packages/crypto/src/networks/mainnet/index.ts @@ -1,6 +1,5 @@ -import dynamicFees from "./dynamicFees.json"; import exceptions from "./exceptions.json"; import milestones from "./milestones.json"; import network from "./network.json"; -export const mainnet = { dynamicFees, exceptions, milestones, network }; +export const mainnet = { exceptions, milestones, network }; diff --git a/packages/crypto/src/networks/testnet/index.ts b/packages/crypto/src/networks/testnet/index.ts index ba4942545e..d9e83d3f0e 100644 --- a/packages/crypto/src/networks/testnet/index.ts +++ b/packages/crypto/src/networks/testnet/index.ts @@ -1,6 +1,5 @@ -import dynamicFees from "./dynamicFees.json"; import exceptions from "./exceptions.json"; import milestones from "./milestones.json"; import network from "./network.json"; -export const testnet = { dynamicFees, exceptions, milestones, network }; +export const testnet = { exceptions, milestones, network }; From 1b48558c6a1b56525fdcea9a460caf71c6a2147d Mon Sep 17 00:00:00 2001 From: supaiku Date: Mon, 17 Dec 2018 16:16:43 +0100 Subject: [PATCH 59/63] fix: move dynamic fee calculation to matcher --- .../src/config/testnet/plugins.js | 4 + .../__tests__/dynamic-fee.test.ts | 8 +- .../src/dynamic-fee/index.ts | 5 +- .../src/dynamic-fee/manager.ts | 77 ------------------- .../src/dynamic-fee/matcher.ts | 29 ++++++- packages/core-transaction-pool/src/index.ts | 3 - 6 files changed, 35 insertions(+), 91 deletions(-) delete mode 100644 packages/core-transaction-pool/src/dynamic-fee/manager.ts diff --git a/packages/core-test-utils/src/config/testnet/plugins.js b/packages/core-test-utils/src/config/testnet/plugins.js index 1c00be0cc4..2d0d3cd85f 100644 --- a/packages/core-test-utils/src/config/testnet/plugins.js +++ b/packages/core-test-utils/src/config/testnet/plugins.js @@ -30,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-transaction-pool/__tests__/dynamic-fee.test.ts b/packages/core-transaction-pool/__tests__/dynamic-fee.test.ts index e7e14b092b..0eceb8cba0 100644 --- a/packages/core-transaction-pool/__tests__/dynamic-fee.test.ts +++ b/packages/core-transaction-pool/__tests__/dynamic-fee.test.ts @@ -1,3 +1,4 @@ +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 () => { @@ -22,8 +24,7 @@ describe("static fees", () => { }, })); - const h = blockchain.getLastBlock().data.height; - container.resolvePlugin("transactionPool").config.set("dynamicFees.enabled", false); + config.set("dynamicFees.enabled", false); }); it("should accept transactions matching the static fee for broadcast", () => { @@ -56,8 +57,7 @@ describe("dynamic fees", () => { }, })); - const h = blockchain.getLastBlock().data.height; - container.resolvePlugin("transactionPool").config.set("dynamicFees.enabled", true); + config.set("dynamicFees.enabled", true); }); it("should broadcast transactions with high enough fee", () => { diff --git a/packages/core-transaction-pool/src/dynamic-fee/index.ts b/packages/core-transaction-pool/src/dynamic-fee/index.ts index f9cd7482e1..9bf385052f 100644 --- a/packages/core-transaction-pool/src/dynamic-fee/index.ts +++ b/packages/core-transaction-pool/src/dynamic-fee/index.ts @@ -1,4 +1,3 @@ -import { dynamicFeeManager } from "./manager"; -import { dynamicFeeMatcher } from "./matcher"; +import { calculateFee, dynamicFeeMatcher } from "./matcher"; -export { dynamicFeeManager, dynamicFeeMatcher }; +export { calculateFee, dynamicFeeMatcher }; diff --git a/packages/core-transaction-pool/src/dynamic-fee/manager.ts b/packages/core-transaction-pool/src/dynamic-fee/manager.ts deleted file mode 100644 index 6cccad3cbd..0000000000 --- a/packages/core-transaction-pool/src/dynamic-fee/manager.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { constants } from "@arkecosystem/crypto"; -import camelCase from "lodash/camelCase"; -import { config as localConfig } from "../config"; - -const { TRANSACTION_TYPES } = constants; - -class DynamicFeeManager { - public offsets: {}; - - /** - * @constructor - */ - constructor() { - this.offsets = {}; - } - - /** - * @constructor - */ - public init() { - const addonBytes = localConfig.get("dynamicFees").addonBytes; - - for (const type of Object.keys(TRANSACTION_TYPES)) { - this.set(TRANSACTION_TYPES[type], addonBytes[camelCase(type)]); - } - } - - /** - * 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; - } -} - -export const dynamicFeeManager = new DynamicFeeManager(); diff --git a/packages/core-transaction-pool/src/dynamic-fee/matcher.ts b/packages/core-transaction-pool/src/dynamic-fee/matcher.ts index ed2badfe63..81602fd665 100644 --- a/packages/core-transaction-pool/src/dynamic-fee/matcher.ts +++ b/packages/core-transaction-pool/src/dynamic-fee/matcher.ts @@ -1,7 +1,28 @@ import { app } from "@arkecosystem/core-container"; -import { feeManager, formatArktoshi } from "@arkecosystem/crypto"; +import { constants, feeManager, formatArktoshi } from "@arkecosystem/crypto"; +import camelCase from "lodash/camelCase"; import { config as localConfig } from "../config"; -import { dynamicFeeManager } from "../dynamic-fee"; + +/** + * 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.TRANSACTION_TYPES.toString(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 @@ -21,7 +42,7 @@ export function dynamicFeeMatcher(transaction) { let enterPool; if (dynamicFees.enabled) { - const minFeeBroadcast = dynamicFeeManager.calculateFee(dynamicFees.minFeeBroadcast, transaction); + const minFeeBroadcast = calculateFee(dynamicFees.minFeeBroadcast, transaction); if (fee >= minFeeBroadcast) { broadcast = true; @@ -39,7 +60,7 @@ export function dynamicFeeMatcher(transaction) { ); } - const minFeePool = dynamicFeeManager.calculateFee(dynamicFees.minFeePool, transaction); + const minFeePool = calculateFee(dynamicFees.minFeePool, transaction); if (fee >= minFeePool) { enterPool = true; logger.debug( diff --git a/packages/core-transaction-pool/src/index.ts b/packages/core-transaction-pool/src/index.ts index 07a6394de1..3c3510e5f6 100644 --- a/packages/core-transaction-pool/src/index.ts +++ b/packages/core-transaction-pool/src/index.ts @@ -1,7 +1,6 @@ import { config } from "./config"; import { TransactionPool } from "./connection"; import { defaults } from "./defaults"; -import { dynamicFeeManager } from "./dynamic-fee"; import { transactionPoolManager } from "./manager"; /** @@ -15,8 +14,6 @@ const plugin = { async register(container, options) { config.init(options); - dynamicFeeManager.init(); - container.resolvePlugin("logger").info("Connecting to transaction pool"); await transactionPoolManager.makeConnection(new TransactionPool(options)); From 8df3d9aa65c978b17401fe43f0341a0e26c47e49 Mon Sep 17 00:00:00 2001 From: supaiku Date: Mon, 17 Dec 2018 16:17:49 +0100 Subject: [PATCH 60/63] chore: remove dynamicFeeManager --- .../crypto/__tests__/managers/config.test.ts | 1 - packages/crypto/src/managers/config.ts | 1 - packages/crypto/src/managers/dynamic-fee.ts | 62 ------------------- packages/crypto/src/managers/index.ts | 3 +- 4 files changed, 1 insertion(+), 66 deletions(-) delete mode 100644 packages/crypto/src/managers/dynamic-fee.ts diff --git a/packages/crypto/__tests__/managers/config.test.ts b/packages/crypto/__tests__/managers/config.test.ts index 49a050aba4..adec736df6 100644 --- a/packages/crypto/__tests__/managers/config.test.ts +++ b/packages/crypto/__tests__/managers/config.test.ts @@ -2,7 +2,6 @@ import "jest-extended"; import { TRANSACTION_TYPES } from "../../src/constants"; import { configManager } from "../../src/managers/config"; -import { dynamicFeeManager } from "../../src/managers/dynamic-fee"; import { feeManager } from "../../src/managers/fee"; import { devnet, mainnet } from "../../src/networks"; diff --git a/packages/crypto/src/managers/config.ts b/packages/crypto/src/managers/config.ts index 2f328818f2..596de36659 100644 --- a/packages/crypto/src/managers/config.ts +++ b/packages/crypto/src/managers/config.ts @@ -2,7 +2,6 @@ import deepmerge from "deepmerge"; import camelCase from "lodash/camelCase"; import get from "lodash/get"; import set from "lodash/set"; -import { dynamicFeeManager } from "./dynamic-fee"; import { feeManager } from "./fee"; import { TRANSACTION_TYPES } from "../constants"; diff --git a/packages/crypto/src/managers/dynamic-fee.ts b/packages/crypto/src/managers/dynamic-fee.ts deleted file mode 100644 index a276268a75..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; - } -} - -export const dynamicFeeManager = new DynamicFeeManager(); 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 }; From 9d8ea7ae882af7fd90a86a6f85eb4aaae2375be4 Mon Sep 17 00:00:00 2001 From: supaiku Date: Mon, 17 Dec 2018 16:32:43 +0100 Subject: [PATCH 61/63] refactor: make TRANSACTION_TYPES an enum --- .../core-api/src/repositories/transactions.ts | 2 +- .../src/versions/2/transactions/controller.ts | 2 +- .../core-api/src/versions/2/votes/methods.ts | 6 +-- .../core-database/__tests__/interface.test.ts | 4 +- .../__tests__/wallet-manager.test.ts | 4 +- packages/core-database/src/interface.ts | 8 ++-- packages/core-database/src/wallet-manager.ts | 21 ++++----- .../src/repositories/transactions.ts | 6 +-- .../__tests__/generators/transactions.test.ts | 4 +- .../generators/transactions/delegate.test.ts | 4 +- .../generators/transactions/signature.test.ts | 4 +- .../generators/transactions/transfer.test.ts | 4 +- .../generators/transactions/vote.test.ts | 4 +- .../types/delegate-resignation.test.ts | 4 +- .../transactions/types/delegate.test.ts | 4 +- .../matchers/transactions/types/ipfs.test.ts | 4 +- .../transactions/types/multi-payment.test.ts | 4 +- .../types/multi-signature.test.ts | 4 +- .../types/second-signature.test.ts | 4 +- .../types/timelock-transfer.test.ts | 4 +- .../transactions/types/transfer.test.ts | 4 +- .../matchers/transactions/types/vote.test.ts | 4 +- .../src/generators/transactions/delegate.ts | 4 +- .../src/generators/transactions/signature.ts | 4 +- .../generators/transactions/transaction.ts | 14 +++--- .../src/generators/transactions/transfer.ts | 4 +- .../src/generators/transactions/vote.ts | 4 +- .../types/delegate-resignation.ts | 6 +-- .../matchers/transactions/types/delegate.ts | 4 +- .../src/matchers/transactions/types/ipfs.ts | 4 +- .../transactions/types/multi-payment.ts | 6 +-- .../transactions/types/multi-signature.ts | 6 +-- .../transactions/types/second-signature.ts | 6 +-- .../transactions/types/timelock-transfer.ts | 6 +-- .../matchers/transactions/types/transfer.ts | 6 +-- .../src/matchers/transactions/types/vote.ts | 4 +- .../__tests__/connection.test.ts | 12 ++--- .../core-transaction-pool/src/connection.ts | 2 +- .../src/dynamic-fee/matcher.ts | 2 +- packages/core-transaction-pool/src/guard.ts | 25 +++++----- .../src/mem-pool-transaction.ts | 4 +- .../src/pool-wallet-manager.ts | 6 +-- .../delegate-registration.test.ts | 6 +-- .../transactions/delegate-resignation.test.ts | 6 +-- .../builder/transactions/ipfs.test.ts | 6 +-- .../transactions/multi-payment.test.ts | 6 +-- .../transactions/multi-signature.test.ts | 6 +-- .../transactions/second-signature.test.ts | 6 +-- .../transactions/timelock-transfer.test.ts | 6 +-- .../builder/transactions/transfer.test.ts | 6 +-- .../builder/transactions/vote.test.ts | 6 +-- packages/crypto/__tests__/constants.test.ts | 40 ++++++++-------- .../crypto/__tests__/crypto/crypto.test.ts | 4 +- .../crypto/__tests__/managers/config.test.ts | 20 ++++---- .../crypto/__tests__/managers/fee.test.ts | 10 ++-- .../transactions/delegate-registration.ts | 6 +-- .../transactions/delegate-resignation.ts | 6 +-- .../crypto/src/builder/transactions/ipfs.ts | 6 +-- .../src/builder/transactions/multi-payment.ts | 6 +-- .../builder/transactions/multi-signature.ts | 6 +-- .../builder/transactions/second-signature.ts | 6 +-- .../builder/transactions/timelock-transfer.ts | 6 +-- .../src/builder/transactions/transfer.ts | 6 +-- .../crypto/src/builder/transactions/vote.ts | 6 +-- packages/crypto/src/constants.ts | 47 +++++-------------- .../crypto/src/handlers/transactions/index.ts | 20 ++++---- packages/crypto/src/managers/config.ts | 6 +-- packages/crypto/src/managers/fee.ts | 6 +-- packages/crypto/src/models/transaction.ts | 46 +++++++++--------- packages/crypto/src/models/wallet.ts | 24 +++++----- .../extensions/transactions/base.ts | 2 +- .../transactions/delegate-registration.ts | 4 +- .../transactions/delegate-resignation.ts | 4 +- .../extensions/transactions/ipfs.ts | 4 +- .../extensions/transactions/multi-payment.ts | 4 +- .../transactions/multi-signature.ts | 4 +- .../transactions/second-signature.ts | 4 +- .../transactions/timelock-transfer.ts | 4 +- .../extensions/transactions/transfer.ts | 4 +- .../extensions/transactions/vote.ts | 4 +- .../transactions/delegate-registration.ts | 4 +- .../transactions/delegate-resignation.ts | 4 +- .../rules/models/transactions/ipfs.ts | 4 +- .../models/transactions/multi-payment.ts | 4 +- .../models/transactions/multi-signature.ts | 4 +- .../models/transactions/second-signature.ts | 4 +- .../models/transactions/timelock-transfer.ts | 4 +- .../rules/models/transactions/transfer.ts | 4 +- .../rules/models/transactions/vote.ts | 4 +- 89 files changed, 308 insertions(+), 335 deletions(-) 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/2/transactions/controller.ts b/packages/core-api/src/versions/2/transactions/controller.ts index 40fc6161ba..f2eda2f1d8 100644 --- a/packages/core-api/src/versions/2/transactions/controller.ts +++ b/packages/core-api/src/versions/2/transactions/controller.ts @@ -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); 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-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__/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 f5344f7ba6..d4cefe8855 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; @@ -542,15 +542,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 6f06c9de09..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; @@ -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); } 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-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/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 1a5d3c4502..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"); } @@ -39,7 +39,7 @@ export const generateTransaction = ( 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/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 253051d8b3..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; @@ -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(); }); }); 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/dynamic-fee/matcher.ts b/packages/core-transaction-pool/src/dynamic-fee/matcher.ts index 81602fd665..c04a8a6ed2 100644 --- a/packages/core-transaction-pool/src/dynamic-fee/matcher.ts +++ b/packages/core-transaction-pool/src/dynamic-fee/matcher.ts @@ -15,7 +15,7 @@ export function calculateFee(arktoshiPerByte, transaction) { } const addonBytes = localConfig.get("dynamicFees.addonBytes")[ - camelCase(constants.TRANSACTION_TYPES.toString(transaction.type)) + camelCase(constants.TransactionTypes[transaction.type]) ]; // serialized is in hex diff --git a/packages/core-transaction-pool/src/guard.ts b/packages/core-transaction-pool/src/guard.ts index 6cc85da398..2b45f0dec6 100644 --- a/packages/core-transaction-pool/src/guard.ts +++ b/packages/core-transaction-pool/src/guard.ts @@ -2,7 +2,7 @@ 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 "./dynamic-fee"; @@ -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/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/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 4373fde4ae..cf6c16e0d0 100644 --- a/packages/crypto/__tests__/constants.test.ts +++ b/packages/crypto/__tests__/constants.test.ts @@ -8,34 +8,34 @@ describe("Constants", () => { }); it("transaction types are defined", () => { - expect(constants.TRANSACTION_TYPES).toBeDefined(); - expect(constants.TRANSACTION_TYPES).toBeFrozen(); + expect(constants.TransactionTypes).toBeDefined(); + expect(constants.TransactionTypes).toBeFrozen(); - 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); + 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 dfd64d80d2..db8b51c083 100644 --- a/packages/crypto/__tests__/crypto/crypto.test.ts +++ b/packages/crypto/__tests__/crypto/crypto.test.ts @@ -1,5 +1,5 @@ import "jest-extended"; -import { TRANSACTION_TYPES } from "../../src/constants"; +import { TransactionTypes } from "../../src/constants"; import { crypto } from "../../src/crypto/crypto"; import { configManager } from "../../src/managers/config"; @@ -139,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); }); diff --git a/packages/crypto/__tests__/managers/config.test.ts b/packages/crypto/__tests__/managers/config.test.ts index adec736df6..9ec9845ebf 100644 --- a/packages/crypto/__tests__/managers/config.test.ts +++ b/packages/crypto/__tests__/managers/config.test.ts @@ -1,6 +1,6 @@ import "jest-extended"; -import { TRANSACTION_TYPES } from "../../src/constants"; +import { TransactionTypes } from "../../src/constants"; import { configManager } from "../../src/managers/config"; import { feeManager } from "../../src/managers/fee"; import { devnet, mainnet } from "../../src/networks"; @@ -38,15 +38,15 @@ describe("Configuration", () => { it("should build fees", () => { const feesStatic = devnet.milestones[0].fees.staticFees; - expect(feeManager.get(TRANSACTION_TYPES.TRANSFER)).toEqual(feesStatic.transfer); - expect(feeManager.get(TRANSACTION_TYPES.SECOND_SIGNATURE)).toEqual(feesStatic.secondSignature); - expect(feeManager.get(TRANSACTION_TYPES.DELEGATE_REGISTRATION)).toEqual(feesStatic.delegateRegistration); - expect(feeManager.get(TRANSACTION_TYPES.VOTE)).toEqual(feesStatic.vote); - expect(feeManager.get(TRANSACTION_TYPES.MULTI_SIGNATURE)).toEqual(feesStatic.multiSignature); - expect(feeManager.get(TRANSACTION_TYPES.IPFS)).toEqual(feesStatic.ipfs); - expect(feeManager.get(TRANSACTION_TYPES.TIMELOCK_TRANSFER)).toEqual(feesStatic.timelockTransfer); - expect(feeManager.get(TRANSACTION_TYPES.MULTI_PAYMENT)).toEqual(feesStatic.multiPayment); - expect(feeManager.get(TRANSACTION_TYPES.DELEGATE_RESIGNATION)).toEqual(feesStatic.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 get milestone for 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/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 839c3b0385..8d8883ae00 100644 --- a/packages/crypto/src/constants.ts +++ b/packages/crypto/src/constants.ts @@ -8,38 +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"); - } - }, -}); + +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/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 596de36659..6da65fddd2 100644 --- a/packages/crypto/src/managers/config.ts +++ b/packages/crypto/src/managers/config.ts @@ -4,7 +4,7 @@ import get from "lodash/get"; import set from "lodash/set"; import { feeManager } from "./fee"; -import { TRANSACTION_TYPES } from "../constants"; +import { TransactionTypes } from "../constants"; import * as networks from "../networks"; export class ConfigManager { @@ -150,8 +150,8 @@ export class ConfigManager { * Build fees from config constants. */ private buildFees() { - for (const type of Object.keys(TRANSACTION_TYPES)) { - feeManager.set(TRANSACTION_TYPES[type], this.getMilestone().fees.staticFees[camelCase(type)]); + for (const type of Object.keys(TransactionTypes)) { + feeManager.set(TransactionTypes[type], this.getMilestone().fees.staticFees[camelCase(type)]); } } } diff --git a/packages/crypto/src/managers/fee.ts b/packages/crypto/src/managers/fee.ts index 66912feb69..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,7 +50,7 @@ export class FeeManager { * @return {Boolean} */ public __validType(type) { - return Object.values(TRANSACTION_TYPES).indexOf(type) > -1; + return Object.values(TransactionTypes).indexOf(type) > -1; } } diff --git a/packages/crypto/src/models/transaction.ts b/packages/crypto/src/models/transaction.ts index f865598efe..3a5b5914f2 100644 --- a/packages/crypto/src/models/transaction.ts +++ b/packages/crypto/src/models/transaction.ts @@ -3,7 +3,7 @@ import bs58check from "bs58check"; import ByteBuffer from "bytebuffer"; import { createHash } from "crypto"; -import { TRANSACTION_TYPES } from "../constants"; +import { TransactionTypes } from "../constants"; import { crypto } from "../crypto/crypto"; import { configManager } from "../managers/config"; import { Bignum } from "../utils"; @@ -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/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() From ea15d051e165d9f5e6f7929c73829bfdc49d3380 Mon Sep 17 00:00:00 2001 From: supaiku Date: Mon, 17 Dec 2018 16:35:08 +0100 Subject: [PATCH 62/63] test: fix --- packages/crypto/__tests__/constants.test.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/crypto/__tests__/constants.test.ts b/packages/crypto/__tests__/constants.test.ts index cf6c16e0d0..c8f2aa4b1c 100644 --- a/packages/crypto/__tests__/constants.test.ts +++ b/packages/crypto/__tests__/constants.test.ts @@ -9,7 +9,6 @@ describe("Constants", () => { it("transaction types are defined", () => { expect(constants.TransactionTypes).toBeDefined(); - expect(constants.TransactionTypes).toBeFrozen(); expect(constants.TransactionTypes.Transfer).toBeDefined(); expect(constants.TransactionTypes.Transfer).toBe(0); From 937403a0c7dcb66e794a0715b5b3ab97ad2a19c2 Mon Sep 17 00:00:00 2001 From: supaiku Date: Mon, 17 Dec 2018 16:45:36 +0100 Subject: [PATCH 63/63] test: call config.init --- packages/core-transaction-pool/__tests__/guard.test.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/core-transaction-pool/__tests__/guard.test.ts b/packages/core-transaction-pool/__tests__/guard.test.ts index a7f2471644..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 () => {