From 9d97bb6f84703eab31058249cc9769b79f1997da Mon Sep 17 00:00:00 2001 From: Tim Moreton Date: Thu, 24 Oct 2019 15:10:04 -0700 Subject: [PATCH 01/61] Update gas prices for free Tobin tax --- .../celotool/src/e2e-tests/transfer_tests.ts | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/celotool/src/e2e-tests/transfer_tests.ts b/packages/celotool/src/e2e-tests/transfer_tests.ts index 0c24c64a303..4ed57ffe2d2 100644 --- a/packages/celotool/src/e2e-tests/transfer_tests.ts +++ b/packages/celotool/src/e2e-tests/transfer_tests.ts @@ -442,7 +442,7 @@ describe('Transfer tests', function(this: any) { before(`start geth on sync: ${syncMode}`, () => startSyncNode(syncMode)) describe('Transfer CeloGold >', () => { - const GOLD_TRANSACTION_GAS_COST = 29180 + const GOLD_TRANSACTION_GAS_COST = 21000 describe('gasCurrency = CeloGold >', () => { if (syncMode === 'light' || syncMode === 'ultralight') { describe('when running in light/ultralight sync mode', () => { @@ -498,7 +498,7 @@ describe('Transfer tests', function(this: any) { describe('when there is no demurrage', () => { describe('when setting a gas amount greater than the amount of gas necessary', () => testTransferToken({ - expectedGas: 163180, + expectedGas: intrinsicGas, transferToken: CeloContract.GoldToken, feeToken: CeloContract.StableToken, txOptions: { @@ -507,10 +507,10 @@ describe('Transfer tests', function(this: any) { })) describe('when setting a gas amount less than the amount of gas necessary but more than the intrinsic gas amount', () => { - const gas = intrinsicGas + 1000 + const gas = intrinsicGas + 5000 testTransferToken({ expectedGas: gas, - transferToken: CeloContract.GoldToken, + transferToken: CeloContract.StableToken, feeToken: CeloContract.StableToken, expectSuccess: false, txOptions: { @@ -542,7 +542,7 @@ describe('Transfer tests', function(this: any) { describe('Transfer CeloDollars', () => { describe('gasCurrency = CeloDollars >', () => { testTransferToken({ - expectedGas: 189456, + expectedGas: 190281, transferToken: CeloContract.StableToken, feeToken: CeloContract.StableToken, txOptions: { @@ -553,7 +553,7 @@ describe('Transfer tests', function(this: any) { describe('gasCurrency = CeloGold >', () => { testTransferToken({ - expectedGas: 40456, + expectedGas: 41281, transferToken: CeloContract.StableToken, feeToken: CeloContract.GoldToken, txOptions: { @@ -593,7 +593,7 @@ describe('Transfer tests', function(this: any) { await inflationManager.changeInflationFactorOnNextTransfer(new BigNumber(2)) const stableTokenAddress = await kit.registry.addressFor(CeloContract.StableToken) - const expectedGasUsed = 163180 + const expectedGasUsed = 155000 const txRes = await runTestTransaction( await transferCeloGold(FromAddress, ToAddress, TransferAmount, { gasCurrency: stableTokenAddress, @@ -666,9 +666,9 @@ describe('Transfer tests', function(this: any) { await inflationManager.changeInflationFactorOnNextTransfer(new BigNumber(2)) const intrinsicGas = 155000 - const gas = intrinsicGas + 1000 + const gas = intrinsicGas + 5000 const txRes = await runTestTransaction( - await transferCeloGold(FromAddress, ToAddress, TransferAmount, { + await transferCeloDollars(FromAddress, ToAddress, TransferAmount, { gas, gasCurrency: await kit.registry.addressFor(CeloContract.StableToken), gasFeeRecipient: FeeRecipientAddress, From fcabb6eacdf07ae84ceb8d4ec8c47abb67a17e5a Mon Sep 17 00:00:00 2001 From: Tim Moreton Date: Thu, 24 Oct 2019 15:15:23 -0700 Subject: [PATCH 02/61] Point circle at branch --- .circleci/config.yml | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 26822ffa1b1..a06f929382e 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -34,6 +34,8 @@ e2e-defaults: &e2e-defaults <<: *defaults docker: - image: celohq/circleci + environment: + CELO_BLOCKCHAIN_BRANCH_TO_TEST: timmoreton/free-tobin-tax general: artifacts: @@ -504,7 +506,7 @@ jobs: command: | set -e cd packages/celotool - ./ci_test_transfers.sh checkout master + ./ci_test_transfers.sh checkout ${CELO_BLOCKCHAIN_BRANCH_TO_TEST} end-to-end-geth-exit-test: <<: *e2e-defaults @@ -522,7 +524,7 @@ jobs: command: | set -e cd packages/celotool - ./ci_test_exit.sh checkout master + ./ci_test_exit.sh checkout ${CELO_BLOCKCHAIN_BRANCH_TO_TEST} end-to-end-geth-governance-test: <<: *e2e-defaults @@ -542,7 +544,7 @@ jobs: command: | set -e cd packages/celotool - ./ci_test_governance.sh checkout master + ./ci_test_governance.sh checkout ${CELO_BLOCKCHAIN_BRANCH_TO_TEST} end-to-end-geth-sync-test: <<: *e2e-defaults @@ -561,7 +563,7 @@ jobs: command: | set -e cd packages/celotool - ./ci_test_sync.sh checkout master + ./ci_test_sync.sh checkout ${CELO_BLOCKCHAIN_BRANCH_TO_TEST} end-to-end-geth-integration-sync-test: <<: *e2e-defaults @@ -578,7 +580,7 @@ jobs: command: | set -e cd packages/celotool - ./ci_test_sync_with_network.sh checkout master + ./ci_test_sync_with_network.sh checkout ${CELO_BLOCKCHAIN_BRANCH_TO_TEST} end-to-end-geth-attestations-test: <<: *e2e-defaults @@ -596,7 +598,7 @@ jobs: command: | set -e cd packages/celotool - ./ci_test_attestations.sh checkout master + ./ci_test_attestations.sh checkout ${CELO_BLOCKCHAIN_BRANCH_TO_TEST} web: working_directory: ~/app From 16684bc92cdc892f591bca79e91b5c4661023ab1 Mon Sep 17 00:00:00 2001 From: Tim Moreton Date: Wed, 13 Nov 2019 14:00:38 -0800 Subject: [PATCH 03/61] Fix tests --- .../celotool/src/e2e-tests/transfer_tests.ts | 22 ++++--------------- 1 file changed, 4 insertions(+), 18 deletions(-) diff --git a/packages/celotool/src/e2e-tests/transfer_tests.ts b/packages/celotool/src/e2e-tests/transfer_tests.ts index 9338bee0a13..f75d887c5af 100644 --- a/packages/celotool/src/e2e-tests/transfer_tests.ts +++ b/packages/celotool/src/e2e-tests/transfer_tests.ts @@ -550,7 +550,7 @@ describe('Transfer tests', function(this: any) { describe('Transfer CeloDollars', () => { describe('gasCurrency = CeloDollars >', () => { testTransferToken({ - expectedGas: 190281, + expectedGas: 175303, // 190303 transferToken: CeloContract.StableToken, feeToken: CeloContract.StableToken, txOptions: { @@ -561,7 +561,7 @@ describe('Transfer tests', function(this: any) { describe('gasCurrency = CeloGold >', () => { testTransferToken({ - expectedGas: 41281, + expectedGas: 41303, transferToken: CeloContract.StableToken, feeToken: CeloContract.GoldToken, txOptions: { @@ -596,7 +596,7 @@ describe('Transfer tests', function(this: any) { describe('when there is no demurrage', () => { describe('when setting a gas amount greater than the amount of gas necessary', () => testTransferToken({ - expectedGas: 63180, + expectedGas: 55000, transferToken: CeloContract.GoldToken, feeToken: CeloContract.StableToken, txOptions: { @@ -604,20 +604,6 @@ describe('Transfer tests', function(this: any) { }, })) - describe('when setting a gas amount less than the amount of gas necessary but more than the intrinsic gas amount', () => { - const gas = intrinsicGas + 1000 - testTransferToken({ - expectedGas: gas, - transferToken: CeloContract.GoldToken, - feeToken: CeloContract.StableToken, - expectSuccess: false, - txOptions: { - gas, - gasFeeRecipient: FeeRecipientAddress, - }, - }) - }) - describe('when setting a gas amount less than the intrinsic gas amount', () => { it('should not add the transaction to the pool', async () => { const gas = intrinsicGas - 1 @@ -640,7 +626,7 @@ describe('Transfer tests', function(this: any) { describe('Transfer CeloDollars', () => { describe('gasCurrency = CeloDollars >', () => { testTransferToken({ - expectedGas: 89456, + expectedGas: 75303, transferToken: CeloContract.StableToken, feeToken: CeloContract.StableToken, txOptions: { From 97d0cb6789d53f06fff68a566f3cec171e421467 Mon Sep 17 00:00:00 2001 From: Tim Moreton Date: Fri, 15 Nov 2019 16:21:55 -0800 Subject: [PATCH 04/61] Fix gas in tests, and remove tests for between intrinsic and required gas, no there is no difference --- .../celotool/src/e2e-tests/transfer_tests.ts | 104 ++---------------- 1 file changed, 8 insertions(+), 96 deletions(-) diff --git a/packages/celotool/src/e2e-tests/transfer_tests.ts b/packages/celotool/src/e2e-tests/transfer_tests.ts index ddb72bf7431..f179602c17d 100644 --- a/packages/celotool/src/e2e-tests/transfer_tests.ts +++ b/packages/celotool/src/e2e-tests/transfer_tests.ts @@ -320,6 +320,11 @@ describe('Transfer tests', function(this: any) { ok = false } + if (receipt != null && receipt.gasUsed !== expectedGasUsed) { + // tslint:disable-next-line: no-console + console.log('OOPSS: Different Gas', receipt.gasUsed, expectedGasUsed) + } + const gasVal = receipt ? receipt.gasUsed : expectedGasUsed assert.isAbove(gasVal, 0) const txHash = await txResult.getHash() @@ -463,7 +468,7 @@ describe('Transfer tests', function(this: any) { before(`start geth on sync: ${syncMode}`, () => startSyncNode(syncMode)) describe('Transfer CeloGold >', () => { - const GOLD_TRANSACTION_GAS_COST = 30005 + const GOLD_TRANSACTION_GAS_COST = 21000 describe('with gasCurrency = CeloGold >', () => { if (syncMode === 'light' || syncMode === 'ultralight') { describe('when running in light/ultralight sync mode', () => { @@ -527,20 +532,6 @@ describe('Transfer tests', function(this: any) { }, })) - describe('when setting a gas amount less than the amount of gas necessary but more than the intrinsic gas amount', () => { - const gas = intrinsicGas + 5000 - testTransferToken({ - expectedGas: gas, - transferToken: CeloContract.StableToken, - feeToken: CeloContract.StableToken, - expectSuccess: false, - txOptions: { - gas, - gasFeeRecipient: FeeRecipientAddress, - }, - }) - }) - describe('when setting a gas amount less than the intrinsic gas amount', () => { it('should not add the transaction to the pool', async () => { const gas = intrinsicGas - 1 @@ -609,7 +600,7 @@ describe('Transfer tests', function(this: any) { describe('when there is no demurrage', () => { describe('when setting a gas amount greater than the amount of gas necessary', () => testTransferToken({ - expectedGas: 64005, + expectedGas: 55000, transferToken: CeloContract.GoldToken, feeToken: CeloContract.StableToken, txOptions: { @@ -679,7 +670,7 @@ describe('Transfer tests', function(this: any) { await inflationManager.setInflationRateForNextTransfer(new BigNumber(2)) const stableTokenAddress = await kit.registry.addressFor(CeloContract.StableToken) - const expectedGasUsed = 164005 + const expectedGasUsed = 155000 txRes = await runTestTransaction( await transferCeloGold(FromAddress, ToAddress, TransferAmount, { gasCurrency: stableTokenAddress, @@ -738,85 +729,6 @@ describe('Transfer tests', function(this: any) { ) }) }) - - describe('when setting a gas amount less than the amount of gas necessary but more than the intrinsic gas amount', () => { - let balances: BalanceWatcher - let expectedFees: Fees - let txRes: TestTxResults - - before(async () => { - balances = await newBalanceWatcher(kit, [ - FromAddress, - ToAddress, - validatorAddress, - FeeRecipientAddress, - governanceAddress, - ]) - - await inflationManager.setInflationRateForNextTransfer(new BigNumber(2)) - - const intrinsicGas = 155000 - const gas = intrinsicGas + 5000 - txRes = await runTestTransaction( - await transferCeloDollars(FromAddress, ToAddress, TransferAmount, { - gas, - gasCurrency: await kit.registry.addressFor(CeloContract.StableToken), - gasFeeRecipient: FeeRecipientAddress, - }), - gas, - await kit.registry.addressFor(CeloContract.StableToken) - ) - - await balances.update() - expectedFees = txRes.fees - }) - - it('should fail', () => assert.isFalse(txRes.ok)) - - it("should not change the sender's Celo Gold balance", () => { - assertEqualBN(balances.delta(FromAddress, CeloContract.GoldToken), new BigNumber(0)) - }) - - it("should not change the receiver's Celo Gold balance", () => { - assertEqualBN(balances.delta(ToAddress, CeloContract.GoldToken), new BigNumber(0)) - }) - - it("should halve the sender's Celo Dollar balance due to demurrage and decrement it by the gas fee", () => { - assertEqualBN( - balances - .initial(FromAddress, CeloContract.StableToken) - .idiv(2) - .minus(balances.current(FromAddress, CeloContract.StableToken)), - expectedFees.total - ) - }) - - // TODO(nategraf): Replace gas fee recipient with gateway fee and adjust this check. - it.skip("should increment the fee recipient's Celo Dollar balance by a portion of the gas fee", () => { - assertEqualBN( - balances.delta(FeeRecipientAddress, CeloContract.StableToken), - new BigNumber(0) - ) - }) - - it(`should halve the infrastructure fund's Celo Dollar balance then increment it by the base portion of the gas fee`, () => { - assertEqualBN( - balances - .current(governanceAddress, CeloContract.StableToken) - .minus(balances.initial(governanceAddress, CeloContract.StableToken).idiv(2)), - expectedFees.base - ) - }) - - it('should halve the proposers Celo Dollar balance the increment it by the rest of the gas fee', () => { - assertEqualBN( - balances - .current(validatorAddress, CeloContract.StableToken) - .minus(balances.initial(validatorAddress, CeloContract.StableToken).idiv(2)), - expectedFees.tip - ) - }) - }) }) }) } From 860d9ec6648e90e146d5e8736bed3a4fe39185ad Mon Sep 17 00:00:00 2001 From: Asa Oines Date: Fri, 15 Nov 2019 16:38:05 -0800 Subject: [PATCH 05/61] Update genesis block to include round in aggregated signature (#1736) --- .circleci/config.yml | 10 ++++----- packages/celotool/src/lib/generate_utils.ts | 25 ++++++++++++++++----- 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 2d9e0987e1d..d0170e30e55 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -525,7 +525,7 @@ jobs: command: | set -e cd packages/celotool - ./ci_test_transfers.sh checkout master + ./ci_test_transfers.sh checkout asaj/bls-sign-round end-to-end-geth-blockchain-parameters-test: <<: *e2e-defaults @@ -543,7 +543,7 @@ jobs: command: | set -e cd packages/celotool - ./ci_test_blockchain_parameters.sh checkout master + ./ci_test_blockchain_parameters.sh checkout asaj/bls-sign-round end-to-end-geth-governance-test: <<: *e2e-defaults @@ -563,7 +563,7 @@ jobs: command: | set -e cd packages/celotool - ./ci_test_governance.sh checkout master + ./ci_test_governance.sh checkout asaj/bls-sign-round end-to-end-geth-sync-test: <<: *e2e-defaults @@ -582,7 +582,7 @@ jobs: command: | set -e cd packages/celotool - ./ci_test_sync.sh checkout master + ./ci_test_sync.sh checkout asaj/bls-sign-round end-to-end-geth-validator-order-test: <<: *e2e-defaults @@ -600,7 +600,7 @@ jobs: command: | set -e cd packages/celotool - ./ci_test_validator_order.sh checkout master + ./ci_test_validator_order.sh checkout asaj/bls-sign-round web: working_directory: ~/app diff --git a/packages/celotool/src/lib/generate_utils.ts b/packages/celotool/src/lib/generate_utils.ts index 7acecab6357..c9dbc6d5130 100644 --- a/packages/celotool/src/lib/generate_utils.ts +++ b/packages/celotool/src/lib/generate_utils.ts @@ -158,22 +158,37 @@ export const generateGenesisFromEnv = (enablePetersburg: boolean = true) => { const generateIstanbulExtraData = (validators: Validator[]) => { const istanbulVanity = 32 const blsSignatureVanity = 192 - return ( '0x' + repeat('0', istanbulVanity * 2) + rlp // @ts-ignore .encode([ + // Added validators validators.map((validator) => Buffer.from(validator.address, 'hex')), validators.map((validator) => Buffer.from(validator.blsPublicKey, 'hex')), + // Removed validators new Buffer(0), + // Seal Buffer.from(repeat('0', blsSignatureVanity * 2), 'hex'), + [ + // AggregatedSeal.Bitmap + new Buffer(0), + // AggregatedSeal.Signature + Buffer.from(repeat('0', blsSignatureVanity * 2), 'hex'), + // AggregatedSeal.Round + new Buffer(0), + ], + [ + // ParentAggregatedSeal.Bitmap + new Buffer(0), + // ParentAggregatedSeal.Signature + Buffer.from(repeat('0', blsSignatureVanity * 2), 'hex'), + // ParentAggregatedSeal.Round + new Buffer(0), + ], + // EpochData new Buffer(0), - Buffer.from(repeat('0', blsSignatureVanity * 2), 'hex'), - new Buffer(0), - new Buffer(0), - Buffer.from(repeat('0', blsSignatureVanity * 2), 'hex'), ]) .toString('hex') ) From 013708d0ac45625d0324c507f0519f6db6b4197d Mon Sep 17 00:00:00 2001 From: Asa Oines Date: Fri, 15 Nov 2019 20:08:49 -0800 Subject: [PATCH 06/61] Fix support for validator key rotation, add end-to-end test (#1643) --- .circleci/config.yml | 10 +- .../src/e2e-tests/governance_tests.ts | 284 +++++++++--- packages/celotool/src/e2e-tests/utils.ts | 2 +- packages/cli/package.json | 1 + .../src/commands/account/authorize.test.ts | 24 +- .../cli/src/commands/account/authorize.ts | 33 +- .../cli/src/commands/account/claims.test.ts | 2 +- .../commands/account/proof-of-possession.ts | 28 ++ packages/cli/src/commands/account/register.ts | 11 +- .../cli/src/commands/validator/publicKey.ts | 43 -- .../cli/src/commands/validator/register.ts | 17 +- .../validator/update-bls-public-key.ts | 34 ++ packages/cli/src/utils/checks.ts | 2 +- packages/cli/src/utils/command.ts | 35 +- packages/cli/src/utils/helpers.ts | 22 - .../contractkit/src/wrappers/Accounts.test.ts | 74 ++++ packages/contractkit/src/wrappers/Accounts.ts | 130 ++++-- .../src/wrappers/Validators.test.ts | 17 +- .../contractkit/src/wrappers/Validators.ts | 51 ++- .../docs/command-line-interface/account.md | 41 +- .../docs/command-line-interface/validator.md | 57 +-- packages/mobile/src/identity/commentKey.ts | 2 +- packages/mobile/src/identity/verification.ts | 7 +- packages/mobile/src/import/saga.ts | 2 +- packages/mobile/src/invite/saga.ts | 2 +- packages/mobile/src/qrcode/utils.ts | 2 +- .../mobile/src/recipients/RecipientPicker.tsx | 2 +- .../mobile/src/verify/VerificationCodeRow.tsx | 2 +- .../protocol/contracts/common/Accounts.sol | 419 +++++++++--------- .../contracts/common/UsingPrecompiles.sol | 10 +- .../contracts/common/interfaces/IAccounts.sol | 8 +- .../contracts/governance/Election.sol | 10 +- .../contracts/governance/Governance.sol | 6 +- .../contracts/governance/Validators.sol | 248 ++++++++--- .../governance/interfaces/IElection.sol | 2 +- .../governance/interfaces/IValidators.sol | 2 + .../governance/test/MockElection.sol | 2 +- .../governance/test/MockValidators.sol | 27 +- .../governance/test/ValidatorsTest.sol | 8 +- .../contracts/identity/Attestations.sol | 4 +- packages/protocol/lib/test-utils.ts | 25 -- packages/protocol/lib/web3-utils.ts | 25 +- packages/protocol/migrations/10_accounts.ts | 18 +- .../migrations/20_elect_validators.ts | 34 +- packages/protocol/package.json | 1 - packages/protocol/test/common/accounts.ts | 63 +-- packages/protocol/test/governance/election.ts | 16 +- .../protocol/test/governance/validators.ts | 330 +++++++++----- .../protocol/test/identity/attestations.ts | 19 +- packages/utils/src/address.ts | 36 +- packages/utils/src/bls.ts | 25 ++ packages/utils/src/io.ts | 2 +- packages/utils/src/signatureUtils.ts | 78 ++-- 53 files changed, 1455 insertions(+), 900 deletions(-) create mode 100644 packages/cli/src/commands/account/proof-of-possession.ts delete mode 100644 packages/cli/src/commands/validator/publicKey.ts create mode 100644 packages/cli/src/commands/validator/update-bls-public-key.ts create mode 100644 packages/contractkit/src/wrappers/Accounts.test.ts diff --git a/.circleci/config.yml b/.circleci/config.yml index d0170e30e55..1a53a694298 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -525,7 +525,7 @@ jobs: command: | set -e cd packages/celotool - ./ci_test_transfers.sh checkout asaj/bls-sign-round + ./ci_test_transfers.sh checkout asaj/key-rotation-plus-enode end-to-end-geth-blockchain-parameters-test: <<: *e2e-defaults @@ -543,7 +543,7 @@ jobs: command: | set -e cd packages/celotool - ./ci_test_blockchain_parameters.sh checkout asaj/bls-sign-round + ./ci_test_blockchain_parameters.sh checkout asaj/key-rotation-plus-enode end-to-end-geth-governance-test: <<: *e2e-defaults @@ -563,7 +563,7 @@ jobs: command: | set -e cd packages/celotool - ./ci_test_governance.sh checkout asaj/bls-sign-round + ./ci_test_governance.sh checkout asaj/key-rotation-plus-enode end-to-end-geth-sync-test: <<: *e2e-defaults @@ -582,7 +582,7 @@ jobs: command: | set -e cd packages/celotool - ./ci_test_sync.sh checkout asaj/bls-sign-round + ./ci_test_sync.sh checkout asaj/key-rotation-plus-enode end-to-end-geth-validator-order-test: <<: *e2e-defaults @@ -600,7 +600,7 @@ jobs: command: | set -e cd packages/celotool - ./ci_test_validator_order.sh checkout asaj/bls-sign-round + ./ci_test_validator_order.sh checkout asaj/key-rotation-plus-enode web: working_directory: ~/app diff --git a/packages/celotool/src/e2e-tests/governance_tests.ts b/packages/celotool/src/e2e-tests/governance_tests.ts index 7f66cc0ee0e..87af3bce44c 100644 --- a/packages/celotool/src/e2e-tests/governance_tests.ts +++ b/packages/celotool/src/e2e-tests/governance_tests.ts @@ -1,5 +1,7 @@ +// tslint:disable-next-line: no-reference (Required to make this work w/ ts-node) +/// import { ContractKit, newKitFromWeb3 } from '@celo/contractkit' -import { AccountsWrapper } from '@celo/contractkit/lib/wrappers/Accounts' +import { getBlsPoP, getBlsPublicKey } from '@celo/utils/lib/bls' import { fromFixed, toFixed } from '@celo/utils/lib/fixidity' import BigNumber from 'bignumber.js' import { assert } from 'chai' @@ -8,17 +10,21 @@ import { assertAlmostEqual, getContext, getEnode, + GethInstanceConfig, importGenesis, initAndStartGeth, sleep, } from './utils' +// TODO(asa): Test independent rotation of ecdsa, bls keys. describe('governance tests', () => { const gethConfig = { migrate: true, instances: [ + // Validators 0 and 1 are swapped in and out of the group. { name: 'validator0', validating: true, syncmode: 'full', port: 30303, rpcport: 8545 }, { name: 'validator1', validating: true, syncmode: 'full', port: 30305, rpcport: 8547 }, + // Validator 2 will authorize a validating key every other epoch. { name: 'validator2', validating: true, syncmode: 'full', port: 30307, rpcport: 8549 }, { name: 'validator3', validating: true, syncmode: 'full', port: 30309, rpcport: 8551 }, { name: 'validator4', validating: true, syncmode: 'full', port: 30311, rpcport: 8553 }, @@ -34,7 +40,7 @@ describe('governance tests', () => { let goldToken: any let registry: any let validators: any - let accounts: AccountsWrapper + let accounts: any let kit: ContractKit before(async function(this: any) { @@ -55,7 +61,7 @@ describe('governance tests', () => { registry = await kit._web3Contracts.getRegistry() election = await kit._web3Contracts.getElection() epochRewards = await kit._web3Contracts.getEpochRewards() - accounts = await kit.contracts.getAccounts() + accounts = await kit._web3Contracts.getAccounts() } const unlockAccount = async (address: string, theWeb3: any) => { @@ -79,9 +85,17 @@ describe('governance tests', () => { } } - const getValidatorGroupKeys = async () => { + const getValidatorSigner = (address: string, blockNumber?: number) => { + if (blockNumber) { + return accounts.methods.getValidatorSigner(address).call({}, blockNumber) + } else { + return accounts.methods.getValidatorSigner(address).call() + } + } + + const getValidatorGroupPrivateKey = async () => { const [groupAddress] = await validators.methods.getRegisteredValidatorGroups().call() - const name = await accounts.getName(groupAddress) + const name = await accounts.methods.getName(groupAddress).call() const encryptedKeystore64 = name.split(' ')[1] const encryptedKeystore = JSON.parse(Buffer.from(encryptedKeystore64, 'base64').toString()) // The validator group ID is the validator group keystore encrypted with validator 0's @@ -89,7 +103,7 @@ describe('governance tests', () => { // @ts-ignore const encryptionKey = `0x${gethConfig.instances[0].privateKey}` const decryptedKeystore = web3.eth.accounts.decrypt(encryptedKeystore, encryptionKey) - return [groupAddress, decryptedKeystore.privateKey] + return decryptedKeystore.privateKey } const activate = async (account: string, txOptions: any = {}) => { @@ -103,12 +117,8 @@ describe('governance tests', () => { return tx.send({ from: account, ...txOptions, gas }) } - const removeMember = async ( - groupWeb3: any, - group: string, - member: string, - txOptions: any = {} - ) => { + const removeMember = async (groupWeb3: any, member: string, txOptions: any = {}) => { + const group = (await groupWeb3.eth.getAccounts())[0] await unlockAccount(group, groupWeb3) const tx = validators.methods.removeMember(member) let gas = txOptions.gas @@ -118,7 +128,8 @@ describe('governance tests', () => { return tx.send({ from: group, ...txOptions, gas }) } - const addMember = async (groupWeb3: any, group: string, member: string, txOptions: any = {}) => { + const addMember = async (groupWeb3: any, member: string, txOptions: any = {}) => { + const group = (await groupWeb3.eth.getAccounts())[0] await unlockAccount(group, groupWeb3) const tx = validators.methods.addMember(member) let gas = txOptions.gas @@ -128,6 +139,37 @@ describe('governance tests', () => { return tx.send({ from: group, ...txOptions, gas }) } + const authorizeValidatorSigner = async (validatorWeb3: any, signerWeb3: any) => { + const validator: string = (await validatorWeb3.eth.getAccounts())[0] + const signer: string = (await signerWeb3.eth.getAccounts())[0] + await unlockAccount(validator, validatorWeb3) + await unlockAccount(signer, signerWeb3) + const pop = await (await newKitFromWeb3( + signerWeb3 + ).contracts.getAccounts()).generateProofOfSigningKeyPossession(validator, signer) + const accountsWrapper = await newKitFromWeb3(validatorWeb3).contracts.getAccounts() + return (await accountsWrapper.authorizeValidatorSigner(signer, pop)).sendAndWaitForReceipt({ + from: validator, + }) + } + + const updateValidatorBlsKey = async ( + validatorWeb3: any, + signerWeb3: any, + signerPrivateKey: string + ) => { + const validator: string = (await validatorWeb3.eth.getAccounts())[0] + const signer: string = (await signerWeb3.eth.getAccounts())[0] + await unlockAccount(signer, signerWeb3) + const blsPublicKey = getBlsPublicKey(signerPrivateKey) + const blsPop = getBlsPoP(validator, signerPrivateKey) + // TODO(asa): Send this from the signer instead. + const validatorsWrapper = await newKitFromWeb3(validatorWeb3).contracts.getValidators() + return validatorsWrapper + .updateBlsPublicKey(blsPublicKey, blsPop) + .sendAndWaitForReceipt({ from: validator }) + } + const isLastBlockOfEpoch = (blockNumber: number, epochSize: number) => { return blockNumber % epochSize === 0 } @@ -144,32 +186,72 @@ describe('governance tests', () => { const previousBalance = new BigNumber( await token.methods.balanceOf(address).call({}, blockNumber - 1) ) - assert.isNotNaN(currentBalance) - assert.isNotNaN(previousBalance) + assert.isFalse(currentBalance.isNaN()) + assert.isFalse(previousBalance.isNaN()) assertAlmostEqual(currentBalance.minus(previousBalance), expected) } describe('when the validator set is changing', () => { let epoch: number const blockNumbers: number[] = [] - let allValidators: string[] + let validatorAccounts: string[] before(async function(this: any) { this.timeout(0) // Disable test timeout await restart() - const [groupAddress, groupPrivateKey] = await getValidatorGroupKeys() - - const groupInstance = { - name: 'validatorGroup', - validating: false, - syncmode: 'full', - port: 30325, - wsport: 8567, - privateKey: groupPrivateKey.slice(2), - peers: [await getEnode(8545)], - } - await initAndStartGeth(context.hooks.gethBinaryPath, groupInstance) - allValidators = await getValidatorGroupMembers() - assert.equal(allValidators.length, 5) + const groupPrivateKey = await getValidatorGroupPrivateKey() + const rotation0PrivateKey = + '0xa42ac9c99f6ab2c96ee6cae1b40d36187f65cd878737f6623cd363fb94ba7087' + const rotation1PrivateKey = + '0x4519cae145fb9499358be484ca60c80d8f5b7f9c13ff82c88ec9e13283e9de1a' + const additionalNodes: GethInstanceConfig[] = [ + { + name: 'validatorGroup', + validating: false, + syncmode: 'full', + port: 30313, + wsport: 8555, + rpcport: 8557, + privateKey: groupPrivateKey.slice(2), + peers: [await getEnode(8545)], + }, + ] + await Promise.all( + additionalNodes.map((nodeConfig) => + initAndStartGeth(context.hooks.gethBinaryPath, nodeConfig) + ) + ) + // Connect the validating nodes to the non-validating nodes, to test that announce messages + // are properly gossiped. + const additionalValidatingNodes = [ + { + name: 'validator2KeyRotation0', + validating: true, + syncmode: 'full', + lightserv: false, + port: 30315, + wsport: 8559, + privateKey: rotation0PrivateKey.slice(2), + peers: [await getEnode(8557)], + }, + { + name: 'validator2KeyRotation1', + validating: true, + syncmode: 'full', + lightserv: false, + port: 30317, + wsport: 8561, + privateKey: rotation1PrivateKey.slice(2), + peers: [await getEnode(8557)], + }, + ] + await Promise.all( + additionalValidatingNodes.map((nodeConfig) => + initAndStartGeth(context.hooks.gethBinaryPath, nodeConfig) + ) + ) + + validatorAccounts = await getValidatorGroupMembers() + assert.equal(validatorAccounts.length, 5) epoch = new BigNumber(await validators.methods.getEpochSize().call()).toNumber() assert.equal(epoch, 10) @@ -180,26 +262,59 @@ describe('governance tests', () => { await sleep(0.1) } while (blockNumber % epoch !== 1) - await activate(allValidators[0]) - const groupWeb3 = new Web3('ws://localhost:8567') + await activate(validatorAccounts[0]) + + // Prepare for member swapping. + const groupWeb3 = new Web3('ws://localhost:8555') const groupKit = newKitFromWeb3(groupWeb3) validators = await groupKit._web3Contracts.getValidators() - const membersToSwap = [allValidators[0], allValidators[1]] - let includedMemberIndex = 1 - await removeMember(groupWeb3, groupAddress, membersToSwap[0]) + const membersToSwap = [validatorAccounts[0], validatorAccounts[1]] + await removeMember(groupWeb3, membersToSwap[1]) + + // Prepare for key rotation. + const validatorWeb3 = new Web3('http://localhost:8549') + const authorizedWeb3s = [new Web3('ws://localhost:8559'), new Web3('ws://localhost:8561')] + const authorizedPrivateKeys = [rotation0PrivateKey, rotation1PrivateKey] + + let index = 0 + let errorWhileChangingValidatorSet = '' + // Can't recycle signing keys. + let doneAuthorizing = false const changeValidatorSet = async (header: any) => { - blockNumbers.push(header.number) - // At the start of epoch N, swap members so the validator set is different for epoch N + 1. - if (header.number % epoch === 1) { - const memberToRemove = membersToSwap[includedMemberIndex] - const memberToAdd = membersToSwap[(includedMemberIndex + 1) % 2] - await removeMember(groupWeb3, groupAddress, memberToRemove) - await addMember(groupWeb3, groupAddress, memberToAdd) - includedMemberIndex = (includedMemberIndex + 1) % 2 - const newMembers = await getValidatorGroupMembers() - assert.include(newMembers, memberToAdd) - assert.notInclude(newMembers, memberToRemove) + try { + blockNumbers.push(header.number) + // At the start of epoch N, perform actions so the validator set is different for epoch N + 1. + if (header.number % epoch === 1) { + // 1. Swap validator0 and validator1 so one is a member of the group and the other is not. + const memberToRemove = membersToSwap[index] + const memberToAdd = membersToSwap[(index + 1) % 2] + await removeMember(groupWeb3, memberToRemove) + await addMember(groupWeb3, memberToAdd) + const newMembers = await getValidatorGroupMembers() + assert.include(newMembers, memberToAdd) + assert.notInclude(newMembers, memberToRemove) + // 2. Rotate keys for validator 2 by authorizing a new validating key. + if (!doneAuthorizing) { + await authorizeValidatorSigner(validatorWeb3, authorizedWeb3s[index]) + await updateValidatorBlsKey( + validatorWeb3, + authorizedWeb3s[index], + authorizedPrivateKeys[index] + ) + } + doneAuthorizing = doneAuthorizing || index === 1 + const signingKeys = await Promise.all( + newMembers.map((v: string) => getValidatorSigner(v)) + ) + // Confirm that authorizing signing keys worked. + // @ts-ignore Type does not include `notSameMembers` + assert.notSameMembers(newMembers, signingKeys) + index = (index + 1) % 2 + } + } catch (e) { + console.error(e) + errorWhileChangingValidatorSet = e } } @@ -210,12 +325,22 @@ describe('governance tests', () => { ;(subscription as any).unsubscribe() // Wait for the current epoch to complete. await sleep(epoch) + assert.equal(errorWhileChangingValidatorSet, '') }) - const getValidatorSetAtBlock = async (blockNumber: number): Promise => { + const getValidatorSetSignersAtBlock = async (blockNumber: number): Promise => { return election.methods.currentValidators().call({}, blockNumber) } + const getValidatorSetAccountsAtBlock = async (blockNumber: number) => { + const signingKeys = await getValidatorSetSignersAtBlock(blockNumber) + return Promise.all( + signingKeys.map((address: string) => + accounts.methods.signerToAccount(address).call({}, blockNumber) + ) + ) + } + const getLastEpochBlock = (blockNumber: number) => { const epochNumber = Math.floor((blockNumber - 1) / epoch) return epochNumber * epoch @@ -232,20 +357,39 @@ describe('governance tests', () => { } }) - it('should always return a validator set equal to the group members at the end of the last epoch', async () => { + it('should always return a validator set equal to the signing keys of the group members at the end of the last epoch', async function(this: any) { + this.timeout(0) for (const blockNumber of blockNumbers) { const lastEpochBlock = getLastEpochBlock(blockNumber) - const groupMembership = await getValidatorGroupMembers(lastEpochBlock) - const validatorSet = await getValidatorSetAtBlock(blockNumber) - assert.sameMembers(groupMembership, validatorSet) + const memberAccounts = await getValidatorGroupMembers(lastEpochBlock) + const memberSigners = await Promise.all( + memberAccounts.map((v: string) => getValidatorSigner(v, lastEpochBlock)) + ) + const validatorSetSigners = await getValidatorSetSignersAtBlock(blockNumber) + const validatorSetAccounts = await getValidatorSetAccountsAtBlock(blockNumber) + assert.sameMembers(memberSigners, validatorSetSigners) + assert.sameMembers(memberAccounts, validatorSetAccounts) } }) - it('should only have created blocks whose miner was in the current validator set', async () => { + it('should block propose in a round robin fashion', async () => { + let roundRobinOrder: string[] = [] for (const blockNumber of blockNumbers) { - const validatorSet = await getValidatorSetAtBlock(blockNumber) + const lastEpochBlock = getLastEpochBlock(blockNumber) + // Fetch the round robin order if it hasn't already been set for this epoch. + if (roundRobinOrder.length === 0 || blockNumber === lastEpochBlock + 1) { + const validatorSet = await getValidatorSetSignersAtBlock(blockNumber) + roundRobinOrder = await Promise.all( + validatorSet.map( + async (_, i) => (await web3.eth.getBlock(lastEpochBlock + i + 1)).miner + ) + ) + assert.sameMembers(roundRobinOrder, validatorSet) + } + const indexInEpoch = blockNumber - lastEpochBlock - 1 + const expectedProposer = roundRobinOrder[indexInEpoch % roundRobinOrder.length] const block = await web3.eth.getBlock(blockNumber) - assert.include(validatorSet.map((x) => x.toLowerCase()), block.miner.toLowerCase()) + assert.equal(block.miner.toLowerCase(), expectedProposer.toLowerCase()) } }) @@ -257,10 +401,10 @@ describe('governance tests', () => { const assertScoreUnchanged = async (validator: string, blockNumber: number) => { const score = new BigNumber( - (await validators.methods.getValidator(validator).call({}, blockNumber))[2] + (await validators.methods.getValidator(validator).call({}, blockNumber)).score ) const previousScore = new BigNumber( - (await validators.methods.getValidator(validator).call({}, blockNumber - 1))[2] + (await validators.methods.getValidator(validator).call({}, blockNumber - 1)).score ) assert.isFalse(score.isNaN()) assert.isFalse(previousScore.isNaN()) @@ -269,10 +413,10 @@ describe('governance tests', () => { const assertScoreChanged = async (validator: string, blockNumber: number) => { const score = new BigNumber( - (await validators.methods.getValidator(validator).call({}, blockNumber))[2] + (await validators.methods.getValidator(validator).call({}, blockNumber)).score ) const previousScore = new BigNumber( - (await validators.methods.getValidator(validator).call({}, blockNumber - 1))[2] + (await validators.methods.getValidator(validator).call({}, blockNumber - 1)).score ) assert.isFalse(score.isNaN()) assert.isFalse(previousScore.isNaN()) @@ -286,10 +430,10 @@ describe('governance tests', () => { let expectUnchangedScores: string[] let expectChangedScores: string[] if (isLastBlockOfEpoch(blockNumber, epoch)) { - expectChangedScores = await getValidatorSetAtBlock(blockNumber) - expectUnchangedScores = allValidators.filter((x) => !expectChangedScores.includes(x)) + expectChangedScores = await getValidatorSetAccountsAtBlock(blockNumber) + expectUnchangedScores = validatorAccounts.filter((x) => !expectChangedScores.includes(x)) } else { - expectUnchangedScores = allValidators + expectUnchangedScores = validatorAccounts expectChangedScores = [] } @@ -316,9 +460,9 @@ describe('governance tests', () => { const getExpectedTotalPayment = async (validator: string, blockNumber: number) => { const score = new BigNumber( - (await validators.methods.getValidator(validator).call({}, blockNumber))[2] + (await validators.methods.getValidator(validator).call({}, blockNumber)).score ) - assert.isNotNaN(score) + assert.isFalse(score.isNaN()) // We need to calculate the rewards multiplier for the previous block, before // the rewards actually are awarded. const rewardsMultiplier = new BigNumber( @@ -333,10 +477,12 @@ describe('governance tests', () => { let expectUnchangedBalances: string[] let expectChangedBalances: string[] if (isLastBlockOfEpoch(blockNumber, epoch)) { - expectChangedBalances = await getValidatorSetAtBlock(blockNumber) - expectUnchangedBalances = allValidators.filter((x) => !expectChangedBalances.includes(x)) + expectChangedBalances = await getValidatorSetAccountsAtBlock(blockNumber) + expectUnchangedBalances = validatorAccounts.filter( + (x) => !expectChangedBalances.includes(x) + ) } else { - expectUnchangedBalances = allValidators + expectUnchangedBalances = validatorAccounts expectChangedBalances = [] } @@ -484,13 +630,13 @@ describe('governance tests', () => { ) const difference = currentTarget.minus(previousTarget) - // Assert equal to 10 decimal places due to rounding errors. + // Assert equal to 9 decimal places due to rounding errors. assert.equal( fromFixed(difference) - .dp(10) + .dp(9) .toFixed(), fromFixed(expected) - .dp(10) + .dp(9) .toFixed() ) } diff --git a/packages/celotool/src/e2e-tests/utils.ts b/packages/celotool/src/e2e-tests/utils.ts index 98f669af9e8..9aaaa882178 100644 --- a/packages/celotool/src/e2e-tests/utils.ts +++ b/packages/celotool/src/e2e-tests/utils.ts @@ -213,7 +213,7 @@ export async function init(gethBinaryPath: string, datadir: string, genesisPath: } export async function importPrivateKey(gethBinaryPath: string, instance: GethInstanceConfig) { - const keyFile = '/tmp/key.txt' + const keyFile = `/${getDatadir(instance)}/key.txt` fs.writeFileSync(keyFile, instance.privateKey) console.info(`geth:${instance.name}: import account`) await execCmdWithExitOnFailure( diff --git a/packages/cli/package.json b/packages/cli/package.json index 371e03eab0c..3e7444c9503 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -38,6 +38,7 @@ "@oclif/plugin-help": "^2", "bip32": "^1.0.2", "bip39": "^2.5.0", + "bls12377js": "https://github.com/celo-org/bls12377js#cada1105f4a5e4c2ddd239c1874df3bf33144a10", "chalk": "^2.4.2", "cli-table": "^0.3.1", "cli-ux": "^5.3.1", diff --git a/packages/cli/src/commands/account/authorize.test.ts b/packages/cli/src/commands/account/authorize.test.ts index 1127bd6afcf..fada8a235c7 100644 --- a/packages/cli/src/commands/account/authorize.test.ts +++ b/packages/cli/src/commands/account/authorize.test.ts @@ -8,14 +8,32 @@ process.env.NO_SYNCCHECK = 'true' testWithGanache('account:authorize cmd', (web3: Web3) => { test('can authorize account', async () => { const accounts = await web3.eth.getAccounts() - await Register.run(['--from', accounts[0], '--name', 'Chapulin Colorado']) - await Authorize.run(['--from', accounts[0], '--role', 'validation', '--to', accounts[1]]) + await Register.run(['--from', accounts[0]]) + await Authorize.run([ + '--from', + accounts[0], + '--role', + 'validator', + '--signer', + accounts[1], + '--pop', + '0x1b9fca4bbb5bfb1dbe69ef1cddbd9b4202dcb6b134c5170611e1e36ecfa468d7b46c85328d504934fce6c2a1571603a50ae224d2b32685e84d4d1a1eebad8452eb', + ]) }) test('fails if from is not an account', async () => { const accounts = await web3.eth.getAccounts() await expect( - Authorize.run(['--from', accounts[0], '--role', 'validation', '--to', accounts[1]]) + Authorize.run([ + '--from', + accounts[0], + '--role', + 'validator', + '--signer', + accounts[1], + '--pop', + '0x1b9fca4bbb5bfb1dbe69ef1cddbd9b4202dcb6b134c5170611e1e36ecfa468d7b46c85328d504934fce6c2a1571603a50ae224d2b32685e84d4d1a1eebad8452eb', + ]) ).rejects.toThrow() }) }) diff --git a/packages/cli/src/commands/account/authorize.ts b/packages/cli/src/commands/account/authorize.ts index f34239dae7c..4878f7e4013 100644 --- a/packages/cli/src/commands/account/authorize.ts +++ b/packages/cli/src/commands/account/authorize.ts @@ -5,40 +5,35 @@ import { displaySendTx } from '../../utils/cli' import { Flags } from '../../utils/command' export default class Authorize extends BaseCommand { - static description = 'Authorize an attestation, validation or vote signing key' + static description = 'Authorize an attestation, validator, or vote signer' static flags = { ...BaseCommand.flags, from: Flags.address({ required: true }), role: flags.string({ char: 'r', - options: ['vote', 'validation', 'attestation'], + options: ['vote', 'validator', 'attestation'], description: 'Role to delegate', + required: true, }), - to: Flags.address({ required: true }), + pop: flags.string({ + description: 'Proof-of-possession of the signer key', + required: true, + }), + signer: Flags.address({ required: true }), } static args = [] static examples = [ - 'authorize --from 0x5409ED021D9299bf6814279A6A1411A7e866A631 --role vote --to 0xc1912fEE45d61C87Cc5EA59DaE31190FFFFf232d', + 'authorize --from 0x5409ED021D9299bf6814279A6A1411A7e866A631 --role vote --signer 0x6ecbe1db9ef729cbe972c83fb886247691fb6beb --pop 0x1b9fca4bbb5bfb1dbe69ef1cddbd9b4202dcb6b134c5170611e1e36ecfa468d7b46c85328d504934fce6c2a1571603a50ae224d2b32685e84d4d1a1eebad8452eb', ] async run() { const res = this.parse(Authorize) - - if (!res.flags.role) { - this.error(`Specify role with --role`) - return - } - - if (!res.flags.to) { - this.error(`Specify authorized address with --to`) - return - } - this.kit.defaultAccount = res.flags.from const accounts = await this.kit.contracts.getAccounts() + const sig = accounts.parseSignatureOfAddress(res.flags.from, res.flags.signer, res.flags.pop) await newCheckBuilder(this) .isAccount(res.flags.from) @@ -46,11 +41,11 @@ export default class Authorize extends BaseCommand { let tx: any if (res.flags.role === 'vote') { - tx = await accounts.authorizeVoteSigner(res.flags.from, res.flags.to) - } else if (res.flags.role === 'validation') { - tx = await accounts.authorizeValidationSigner(res.flags.from, res.flags.to) + tx = await accounts.authorizeVoteSigner(res.flags.signer, sig) + } else if (res.flags.role === 'validator') { + tx = await accounts.authorizeValidatorSigner(res.flags.signer, sig) } else if (res.flags.role === 'attestation') { - tx = await accounts.authorizeAttestationSigner(res.flags.from, res.flags.to) + tx = await accounts.authorizeAttestationSigner(res.flags.signer, sig) } else { this.error(`Invalid role provided`) return diff --git a/packages/cli/src/commands/account/claims.test.ts b/packages/cli/src/commands/account/claims.test.ts index df2994703b3..6cb91fb8ce9 100644 --- a/packages/cli/src/commands/account/claims.test.ts +++ b/packages/cli/src/commands/account/claims.test.ts @@ -11,7 +11,7 @@ import CreateMetadata from './create-metadata' import RegisterMetadata from './register-metadata' process.env.NO_SYNCCHECK = 'true' -testWithGanache('account:authorize cmd', (web3: Web3) => { +testWithGanache('account metadata cmds', (web3: Web3) => { let account: string let accounts: string[] beforeEach(async () => { diff --git a/packages/cli/src/commands/account/proof-of-possession.ts b/packages/cli/src/commands/account/proof-of-possession.ts new file mode 100644 index 00000000000..24b0ab206ba --- /dev/null +++ b/packages/cli/src/commands/account/proof-of-possession.ts @@ -0,0 +1,28 @@ +import { serializeSignature } from '@celo/utils/lib/signatureUtils' +import { BaseCommand } from '../../base' +import { printValueMap } from '../../utils/cli' +import { Flags } from '../../utils/command' + +export default class ProofOfPossession extends BaseCommand { + static description = 'Generate proof-of-possession to be used to authorize a signer' + + static flags = { + ...BaseCommand.flags, + signer: Flags.address({ required: true }), + account: Flags.address({ required: true }), + } + + static examples = [ + 'proof-of-possession --account 0x5409ed021d9299bf6814279a6a1411a7e866a631 --signer 0x6ecbe1db9ef729cbe972c83fb886247691fb6beb', + ] + + async run() { + const res = this.parse(ProofOfPossession) + const accounts = await this.kit.contracts.getAccounts() + const pop = await accounts.generateProofOfSigningKeyPossession( + res.flags.account, + res.flags.signer + ) + printValueMap({ signature: serializeSignature(pop) }) + } +} diff --git a/packages/cli/src/commands/account/register.ts b/packages/cli/src/commands/account/register.ts index ea121e9cdfc..9dd445c5838 100644 --- a/packages/cli/src/commands/account/register.ts +++ b/packages/cli/src/commands/account/register.ts @@ -9,13 +9,16 @@ export default class Register extends BaseCommand { static flags = { ...BaseCommand.flags, - name: flags.string({ required: true }), + name: flags.string(), from: Flags.address({ required: true }), } static args = [] - static examples = ['register'] + static examples = [ + 'register --from 0x5409ed021d9299bf6814279a6a1411a7e866a631', + 'register --from 0x5409ed021d9299bf6814279a6a1411a7e866a631 --name test-account', + ] async run() { const res = this.parse(Register) @@ -26,6 +29,8 @@ export default class Register extends BaseCommand { .isNotAccount(res.flags.from) .runChecks() await displaySendTx('register', accounts.createAccount()) - await displaySendTx('setName', accounts.setName(res.flags.name)) + if (res.flags.name) { + await displaySendTx('setName', accounts.setName(res.flags.name)) + } } } diff --git a/packages/cli/src/commands/validator/publicKey.ts b/packages/cli/src/commands/validator/publicKey.ts deleted file mode 100644 index cfe11ab125a..00000000000 --- a/packages/cli/src/commands/validator/publicKey.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { BaseCommand } from '../../base' -import { newCheckBuilder } from '../../utils/checks' -import { displaySendTx } from '../../utils/cli' -import { Flags } from '../../utils/command' -import { getPubKeyFromAddrAndWeb3 } from '../../utils/helpers' - -export default class ValidatorPublicKey extends BaseCommand { - static description = 'Manage BLS public key data for a validator' - - static flags = { - ...BaseCommand.flags, - from: Flags.address({ required: true, description: "Validator's address" }), - publicKey: Flags.publicKey({ required: true }), - } - - static examples = [ - 'publickey --from 0x47e172F6CfB6c7D01C1574fa3E2Be7CC73269D95 --publicKey 0xc52f3fab06e22a54915a8765c4f6826090cfac5e40282b43844bf1c0df83aaa632e55b67869758f2291d1aabe0ebecc7cbf4236aaa45e3e0cfbf997eda082ae19d3e1d8f49f6b0d8e9a03d80ca07b1d24cf1cc0557bdcc04f5e17a46e35d02d0d411d956dbd5d2d2464eebd7b74ae30005d223780d785d2abc5644fac7ac29fb0e302bdc80c81a5d45018b68b1045068a4b3a4861c93037685fd0d252d7405011220a66a6257562d0c26dabf64485a1d96bad27bb1c0fd6080a75b0ec9f75b50298a2a8e04b02b2688c8104fca61fb00', - ] - async run() { - const res = this.parse(ValidatorPublicKey) - this.kit.defaultAccount = res.flags.from - const validators = await this.kit.contracts.getValidators() - const accounts = await this.kit.contracts.getAccounts() - - await newCheckBuilder(this, res.flags.from) - .isSignerOrAccount() - .canSignValidatorTxs() - .signerAccountIsValidator() - .runChecks() - - await displaySendTx( - 'updatePublicKeysData', - validators.updatePublicKeysData(res.flags.publicKey as any) - ) - - // register encryption key on accounts contract - // TODO: Use a different key data encryption - const pubKey = await getPubKeyFromAddrAndWeb3(res.flags.from, this.web3) - // TODO fix typing - const setKeyTx = accounts.setAccountDataEncryptionKey(pubKey as any) - await displaySendTx('Set encryption key', setKeyTx) - } -} diff --git a/packages/cli/src/commands/validator/register.ts b/packages/cli/src/commands/validator/register.ts index bc50dd33dd6..0753ae27088 100644 --- a/packages/cli/src/commands/validator/register.ts +++ b/packages/cli/src/commands/validator/register.ts @@ -1,8 +1,8 @@ +import { addressToPublicKey } from '@celo/utils/lib/signatureUtils' import { BaseCommand } from '../../base' import { newCheckBuilder } from '../../utils/checks' import { displaySendTx } from '../../utils/cli' import { Flags } from '../../utils/command' -import { getPubKeyFromAddrAndWeb3 } from '../../utils/helpers' export default class ValidatorRegister extends BaseCommand { static description = 'Register a new Validator' @@ -10,12 +10,15 @@ export default class ValidatorRegister extends BaseCommand { static flags = { ...BaseCommand.flags, from: Flags.address({ required: true, description: 'Address for the Validator' }), - publicKey: Flags.publicKey({ required: true }), + ecdsaKey: Flags.ecdsaPublicKey({ required: true }), + blsKey: Flags.blsPublicKey({ required: true }), + blsPop: Flags.blsProofOfPossession({ required: true }), } static examples = [ - 'register --from 0x47e172F6CfB6c7D01C1574fa3E2Be7CC73269D95 --publicKey 0xc52f3fab06e22a54915a8765c4f6826090cfac5e40282b43844bf1c0df83aaa632e55b67869758f2291d1aabe0ebecc7cbf4236aaa45e3e0cfbf997eda082ae19d3e1d8f49f6b0d8e9a03d80ca07b1d24cf1cc0557bdcc04f5e17a46e35d02d0d411d956dbd5d2d2464eebd7b74ae30005d223780d785d2abc5644fac7ac29fb0e302bdc80c81a5d45018b68b1045068a4b3a4861c93037685fd0d252d7405011220a66a6257562d0c26dabf64485a1d96bad27bb1c0fd6080a75b0ec9f75b50298a2a8e04b02b2688c8104fca61fb00', + 'register --from 0x47e172F6CfB6c7D01C1574fa3E2Be7CC73269D95 --ecdsaKey 0xc52f3fab06e22a54915a8765c4f6826090cfac5e40282b43844bf1c0df83aaa632e55b67869758f2291d1aabe0ebecc7cbf4236aaa45e3e0cfbf997eda082ae1 --blsKey 0x9d3e1d8f49f6b0d8e9a03d80ca07b1d24cf1cc0557bdcc04f5e17a46e35d02d0d411d956dbd5d2d2464eebd7b74ae300 --blsPop 0x05d223780d785d2abc5644fac7ac29fb0e302bdc80c81a5d45018b68b1045068a4b3a4861c93037685fd0d252d7405011220a66a6257562d0c26dabf64485a1d96bad27bb1c0fd6080a75b0ec9f75b50298a2a8e04b02b2688c8104fca61fb00', ] + async run() { const res = this.parse(ValidatorRegister) this.kit.defaultAccount = res.flags.from @@ -31,12 +34,16 @@ export default class ValidatorRegister extends BaseCommand { await displaySendTx( 'registerValidator', - validators.registerValidator(res.flags.publicKey as any) + validators.registerValidator( + res.flags.ecdsaKey as any, + res.flags.blsKey as any, + res.flags.blsPop as any + ) ) // register encryption key on accounts contract // TODO: Use a different key data encryption - const pubKey = await getPubKeyFromAddrAndWeb3(res.flags.from, this.web3) + const pubKey = await addressToPublicKey(res.flags.from, this.web3.eth.sign) // TODO fix typing const setKeyTx = accounts.setAccountDataEncryptionKey(pubKey as any) await displaySendTx('Set encryption key', setKeyTx) diff --git a/packages/cli/src/commands/validator/update-bls-public-key.ts b/packages/cli/src/commands/validator/update-bls-public-key.ts new file mode 100644 index 00000000000..70521743dea --- /dev/null +++ b/packages/cli/src/commands/validator/update-bls-public-key.ts @@ -0,0 +1,34 @@ +import { BaseCommand } from '../../base' +import { newCheckBuilder } from '../../utils/checks' +import { displaySendTx } from '../../utils/cli' +import { Flags } from '../../utils/command' + +export default class ValidatorUpdateBlsPublicKey extends BaseCommand { + static description = 'Update BLS key for a validator' + + static flags = { + ...BaseCommand.flags, + from: Flags.address({ required: true, description: "Validator's address" }), + blsKey: Flags.blsPublicKey({ required: true }), + blsPop: Flags.blsProofOfPossession({ required: true }), + } + + static examples = [ + 'update-bls-key --from 0x47e172F6CfB6c7D01C1574fa3E2Be7CC73269D95 --blsKey 0x9d3e1d8f49f6b0d8e9a03d80ca07b1d24cf1cc0557bdcc04f5e17a46e35d02d0d411d956dbd5d2d2464eebd7b74ae300 --blsPop 0x05d223780d785d2abc5644fac7ac29fb0e302bdc80c81a5d45018b68b1045068a4b3a4861c93037685fd0d252d7405011220a66a6257562d0c26dabf64485a1d96bad27bb1c0fd6080a75b0ec9f75b50298a2a8e04b02b2688c8104fca61fb00', + ] + async run() { + const res = this.parse(ValidatorUpdateBlsPublicKey) + this.kit.defaultAccount = res.flags.from + const validators = await this.kit.contracts.getValidators() + await newCheckBuilder(this, res.flags.from) + .isSignerOrAccount() + .canSignValidatorTxs() + .signerAccountIsValidator() + .runChecks() + + await displaySendTx( + 'updateBlsPublicKey', + validators.updateBlsPublicKey(res.flags.blsKey as any, res.flags.blsPop as any) + ) + } +} diff --git a/packages/cli/src/utils/checks.ts b/packages/cli/src/utils/checks.ts index 0e79ab09874..d51d3b21df4 100644 --- a/packages/cli/src/utils/checks.ts +++ b/packages/cli/src/utils/checks.ts @@ -73,7 +73,7 @@ class CheckBuilder { 'Signer can sign Validator Txs', this.withAccounts((lg) => lg - .activeValidationSignerToAccount(this.signer!) + .validatorSignerToAccount(this.signer!) .then(() => true) .catch(() => false) ) diff --git a/packages/cli/src/utils/command.ts b/packages/cli/src/utils/command.ts index dee09ae0690..7268010b70c 100644 --- a/packages/cli/src/utils/command.ts +++ b/packages/cli/src/utils/command.ts @@ -1,3 +1,4 @@ +import { BLS_POP_SIZE, BLS_PUBLIC_KEY_SIZE } from '@celo/utils/lib/bls' import { URL_REGEX } from '@celo/utils/lib/io' import { flags } from '@oclif/command' import { CLIError } from '@oclif/errors' @@ -5,14 +6,24 @@ import { IArg, ParseFn } from '@oclif/parser/lib/args' import { pathExistsSync } from 'fs-extra' import Web3 from 'web3' -const parsePublicKey: ParseFn = (input) => { - // Check that the string starts with 0x and has byte length of ecdsa pub key (64 bytes) + bls pub key (48 bytes) + proof of pos (96 bytes) - if (Web3.utils.isHex(input) && input.length === 418 && input.startsWith('0x')) { +const parseBytes = (input: string, length: number, msg: string) => { + // Check that the string starts with 0x and has byte length of `length`. + if (Web3.utils.isHex(input) && input.length === length && input.startsWith('0x')) { return input } else { - throw new CLIError(`${input} is not a public key`) + throw new CLIError(msg) } } + +const parseEcdsaPublicKey: ParseFn = (input) => { + return parseBytes(input, 64, `${input} is not an ECDSA public key`) +} +const parseBlsPublicKey: ParseFn = (input) => { + return parseBytes(input, BLS_PUBLIC_KEY_SIZE, `${input} is not a BLS public key`) +} +const parseBlsProofOfPossession: ParseFn = (input) => { + return parseBytes(input, BLS_POP_SIZE, `${input} is not a BLS proof-of-possession`) +} const parseAddress: ParseFn = (input) => { if (Web3.utils.isAddress(input)) { return input @@ -54,9 +65,19 @@ export const Flags = { description: 'Account Address', helpValue: '0xc1912fEE45d61C87Cc5EA59DaE31190FFFFf232d', }), - publicKey: flags.build({ - parse: parsePublicKey, - description: 'Public Key', + ecdsaPublicKey: flags.build({ + parse: parseEcdsaPublicKey, + description: 'ECDSA Public Key', + helpValue: '0x', + }), + blsPublicKey: flags.build({ + parse: parseBlsPublicKey, + description: 'BLS Public Key', + helpValue: '0x', + }), + blsProofOfPossession: flags.build({ + parse: parseBlsProofOfPossession, + description: 'BLS Proof-of-Possession', helpValue: '0x', }), url: flags.build({ diff --git a/packages/cli/src/utils/helpers.ts b/packages/cli/src/utils/helpers.ts index d95c1354c57..4d8c7c0f768 100644 --- a/packages/cli/src/utils/helpers.ts +++ b/packages/cli/src/utils/helpers.ts @@ -1,29 +1,7 @@ -import { eqAddress } from '@celo/utils/lib/address' -import ethjsutil from 'ethereumjs-util' import Web3 from 'web3' import { Block } from 'web3/eth/types' import { failWith } from './cli' -import assert = require('assert') - -export async function getPubKeyFromAddrAndWeb3(addr: string, web3: Web3) { - const msg = new Buffer('dummy_msg_data') - const data = '0x' + msg.toString('hex') - // Note: Eth.sign typing displays incorrect parameter order - const sig = await web3.eth.sign(data, addr) - - const rawsig = ethjsutil.fromRpcSig(sig) - - const prefix = new Buffer('\x19Ethereum Signed Message:\n') - const prefixedMsg = ethjsutil.sha3(Buffer.concat([prefix, new Buffer(String(msg.length)), msg])) - const pubKey = ethjsutil.ecrecover(prefixedMsg, rawsig.v, rawsig.r, rawsig.s) - - const computedAddr = ethjsutil.pubToAddress(pubKey).toString('hex') - assert(eqAddress(computedAddr, addr), 'computed address !== addr') - - return pubKey -} - export async function nodeIsSynced(web3: Web3): Promise { if (process.env.NO_SYNCCHECK) { return true diff --git a/packages/contractkit/src/wrappers/Accounts.test.ts b/packages/contractkit/src/wrappers/Accounts.test.ts new file mode 100644 index 00000000000..95bd22d4a18 --- /dev/null +++ b/packages/contractkit/src/wrappers/Accounts.test.ts @@ -0,0 +1,74 @@ +import { addressToPublicKey, parseSignature } from '@celo/utils/lib/signatureUtils' +import Web3 from 'web3' +import { newKitFromWeb3 } from '../kit' +import { testWithGanache } from '../test-utils/ganache-test' +import { AccountsWrapper } from './Accounts' +import { LockedGoldWrapper } from './LockedGold' +import { ValidatorsWrapper } from './Validators' + +/* +TEST NOTES: +- In migrations: The only account that has cUSD is accounts[0] +*/ + +const minLockedGoldValue = Web3.utils.toWei('10', 'ether') // 10 gold + +// Random hex strings +const blsPublicKey = + '0x4d23d8cd06f30b1fa7cf368e2f5399ab04bb6846c682f493a98a607d3dfb7e53a712bb79b475c57b0ac2785460f91301' +const blsPoP = + '0x9d3e1d8f49f6b0d8e9a03d80ca07b1d24cf1cc0557bdcc04f5e17a46e35d02d0d411d956dbd5d2d2464eebd7b74ae30005d223780d785d2abc5644fac7ac29fb0e302bdc80c81a5d45018b68b1045068a4b3a4861c93037685fd0d252d740501' + +testWithGanache('Accounts Wrapper', (web3) => { + const kit = newKitFromWeb3(web3) + let accounts: string[] = [] + let accountsInstance: AccountsWrapper + let validators: ValidatorsWrapper + let lockedGold: LockedGoldWrapper + + const registerAccountWithLockedGold = async (account: string) => { + if (!(await accountsInstance.isAccount(account))) { + await accountsInstance.createAccount().sendAndWaitForReceipt({ from: account }) + } + await lockedGold.lock().sendAndWaitForReceipt({ from: account, value: minLockedGoldValue }) + } + + const getParsedSignatureOfAddress = async (address: string, signer: string) => { + const addressHash = web3.utils.soliditySha3({ type: 'address', value: address }) + const signature = await web3.eth.sign(addressHash, signer) + return parseSignature(addressHash, signature, signer) + } + + beforeAll(async () => { + accounts = await web3.eth.getAccounts() + validators = await kit.contracts.getValidators() + lockedGold = await kit.contracts.getLockedGold() + accountsInstance = await kit.contracts.getAccounts() + }) + + const setupValidator = async (validatorAccount: string) => { + const publicKey = await addressToPublicKey(validatorAccount, web3.eth.sign) + await registerAccountWithLockedGold(validatorAccount) + await validators + // @ts-ignore + .registerValidator(publicKey, blsPublicKey, blsPoP) + .sendAndWaitForReceipt({ from: validatorAccount }) + } + + test('SBAT authorize validator key when not a validator', async () => { + const account = accounts[0] + const signer = accounts[1] + await accountsInstance.createAccount() + const sig = await getParsedSignatureOfAddress(account, signer) + await accountsInstance.authorizeValidatorSigner(signer, sig) + }) + + test('SBAT authorize validator key when a validator', async () => { + const account = accounts[0] + const signer = accounts[1] + await accountsInstance.createAccount() + await setupValidator(account) + const sig = await getParsedSignatureOfAddress(account, signer) + await accountsInstance.authorizeValidatorSigner(signer, sig) + }) +}) diff --git a/packages/contractkit/src/wrappers/Accounts.ts b/packages/contractkit/src/wrappers/Accounts.ts index 01afb340612..a995bc664e6 100644 --- a/packages/contractkit/src/wrappers/Accounts.ts +++ b/packages/contractkit/src/wrappers/Accounts.ts @@ -1,3 +1,9 @@ +import { + hashMessageWithPrefix, + parseSignature, + Signature, + signedMessageToPublicKey, +} from '@celo/utils/lib/signatureUtils' import Web3 from 'web3' import { Address } from '../base' import { Accounts } from '../generated/types/Accounts' @@ -9,11 +15,6 @@ import { toTransactionObject, } from '../wrappers/BaseWrapper' -enum SignerRole { - Attestation, - Validation, - Vote, -} /** * Contract for handling deposits needed for voting. */ @@ -40,12 +41,12 @@ export class AccountsWrapper extends BaseWrapper { this.contract.methods.getVoteSigner ) /** - * Returns the validation signere for the specified account. + * Returns the validator signer for the specified account. * @param account The address of the account. * @return The address with which the account can register a validator or group. */ - getValidationSigner: (account: string) => Promise
= proxyCall( - this.contract.methods.getValidationSigner + getValidatorSigner: (account: string) => Promise
= proxyCall( + this.contract.methods.getValidatorSigner ) /** @@ -53,8 +54,8 @@ export class AccountsWrapper extends BaseWrapper { * @param signer Address that is authorized to sign the tx as validator * @return The Account address */ - activeValidationSignerToAccount: (signer: Address) => Promise
= proxyCall( - this.contract.methods.activeValidationSignerToAccount + validatorSignerToAccount: (signer: Address) => Promise
= proxyCall( + this.contract.methods.validatorSignerToAccount ) /** @@ -69,44 +70,98 @@ export class AccountsWrapper extends BaseWrapper { * @param address The address of the account * @return Returns `true` if account exists. Returns `false` otherwise. */ - isSigner: (address: string) => Promise = proxyCall(this.contract.methods.isAuthorized) + isSigner: (address: string) => Promise = proxyCall( + this.contract.methods.isAuthorizedSigner + ) /** * Authorize an attestation signing key on behalf of this account to another address. - * @param account Address of the active account. - * @param attestationSigner The address of the signing key to authorize. + * @param signer The address of the signing key to authorize. + * @param proofOfSigningKeyPossession The account address signed by the signer address. * @return A CeloTransactionObject */ async authorizeAttestationSigner( - account: Address, - attestationSigner: Address + signer: Address, + proofOfSigningKeyPossession: Signature ): Promise> { - return this.authorizeSigner(SignerRole.Attestation, account, attestationSigner) + return toTransactionObject( + this.kit, + this.contract.methods.authorizeAttestationSigner( + signer, + proofOfSigningKeyPossession.v, + proofOfSigningKeyPossession.r, + proofOfSigningKeyPossession.s + ) + ) } /** * Authorizes an address to sign votes on behalf of the account. - * @param account Address of the active account. - * @param voteSigner The address of the vote signing key to authorize. + * @param signer The address of the vote signing key to authorize. + * @param proofOfSigningKeyPossession The account address signed by the signer address. * @return A CeloTransactionObject */ async authorizeVoteSigner( - account: Address, - voteSigner: Address + signer: Address, + proofOfSigningKeyPossession: Signature ): Promise> { - return this.authorizeSigner(SignerRole.Vote, account, voteSigner) + return toTransactionObject( + this.kit, + this.contract.methods.authorizeVoteSigner( + signer, + proofOfSigningKeyPossession.v, + proofOfSigningKeyPossession.r, + proofOfSigningKeyPossession.s + ) + ) } /** * Authorizes an address to sign consensus messages on behalf of the account. - * @param account Address of the active account. - * @param validationSigner The address of the signing key to authorize. + * @param signer The address of the signing key to authorize. + * @param proofOfSigningKeyPossession The account address signed by the signer address. * @return A CeloTransactionObject */ - async authorizeValidationSigner( - account: Address, - validationSigner: Address + async authorizeValidatorSigner( + signer: Address, + proofOfSigningKeyPossession: Signature ): Promise> { - return this.authorizeSigner(SignerRole.Validation, account, validationSigner) + const validators = await this.kit.contracts.getValidators() + const account = this.kit.defaultAccount || (await this.kit.web3.eth.getAccounts())[0] + if (await validators.isValidator(account)) { + const message = this.kit.web3.utils.soliditySha3({ type: 'address', value: account }) + const prefixedMsg = hashMessageWithPrefix(message) + const pubKey = signedMessageToPublicKey( + prefixedMsg, + proofOfSigningKeyPossession.v, + proofOfSigningKeyPossession.r, + proofOfSigningKeyPossession.s + ) + return toTransactionObject( + this.kit, + this.contract.methods.authorizeValidatorSigner( + signer, + pubKey, + proofOfSigningKeyPossession.v, + proofOfSigningKeyPossession.r, + // @ts-ignore Typescript does not support overloading. + proofOfSigningKeyPossession.s + ) + ) + } else { + return toTransactionObject( + this.kit, + this.contract.methods.authorizeValidatorSigner( + signer, + proofOfSigningKeyPossession.v, + proofOfSigningKeyPossession.r, + proofOfSigningKeyPossession.s + ) + ) + } + } + + async generateProofOfSigningKeyPossession(account: Address, signer: Address) { + return this.getParsedSignatureOfAddress(account, signer) } /** @@ -168,25 +223,14 @@ export class AccountsWrapper extends BaseWrapper { */ setWalletAddress = proxySend(this.kit, this.contract.methods.setWalletAddress) - private authorizeFns = { - [SignerRole.Attestation]: this.contract.methods.authorizeAttestationSigner, - [SignerRole.Validation]: this.contract.methods.authorizeValidationSigner, - [SignerRole.Vote]: this.contract.methods.authorizeVoteSigner, - } - - private async authorizeSigner(role: SignerRole, account: Address, signer: Address) { - const sig = await this.getParsedSignatureOfAddress(account, signer) - // TODO(asa): Pass default tx "from" argument. - return toTransactionObject(this.kit, this.authorizeFns[role](signer, sig.v, sig.r, sig.s)) + parseSignatureOfAddress(address: Address, signer: string, signature: string) { + const hash = Web3.utils.soliditySha3({ type: 'address', value: address }) + return parseSignature(hash, signature, signer) } private async getParsedSignatureOfAddress(address: Address, signer: string) { const hash = Web3.utils.soliditySha3({ type: 'address', value: address }) - const signature = (await this.kit.web3.eth.sign(hash, signer)).slice(2) - return { - r: `0x${signature.slice(0, 64)}`, - s: `0x${signature.slice(64, 128)}`, - v: Web3.utils.hexToNumber(signature.slice(128, 130)) + 27, - } + const signature = await this.kit.web3.eth.sign(hash, signer) + return parseSignature(hash, signature, signer) } } diff --git a/packages/contractkit/src/wrappers/Validators.test.ts b/packages/contractkit/src/wrappers/Validators.test.ts index c8b0dfcde1c..e90aec9cdfe 100644 --- a/packages/contractkit/src/wrappers/Validators.test.ts +++ b/packages/contractkit/src/wrappers/Validators.test.ts @@ -1,3 +1,4 @@ +import { addressToPublicKey } from '@celo/utils/lib/signatureUtils' import BigNumber from 'bignumber.js' import Web3 from 'web3' import { newKitFromWeb3 } from '../kit' @@ -13,15 +14,10 @@ TEST NOTES: const minLockedGoldValue = Web3.utils.toWei('10', 'ether') // 10 gold -// A random 64 byte hex string. -const publicKey = - 'ea0733ad275e2b9e05541341a97ee82678c58932464fad26164657a111a7e37a9fa0300266fb90e2135a1f1512350cb4e985488a88809b14e3cbe415e76e82b2' const blsPublicKey = - '4d23d8cd06f30b1fa7cf368e2f5399ab04bb6846c682f493a98a607d3dfb7e53a712bb79b475c57b0ac2785460f91301' + '0x4d23d8cd06f30b1fa7cf368e2f5399ab04bb6846c682f493a98a607d3dfb7e53a712bb79b475c57b0ac2785460f91301' const blsPoP = - '9d3e1d8f49f6b0d8e9a03d80ca07b1d24cf1cc0557bdcc04f5e17a46e35d02d0d411d956dbd5d2d2464eebd7b74ae30005d223780d785d2abc5644fac7ac29fb0e302bdc80c81a5d45018b68b1045068a4b3a4861c93037685fd0d252d740501' - -const publicKeysData = '0x' + publicKey + blsPublicKey + blsPoP + '0x9d3e1d8f49f6b0d8e9a03d80ca07b1d24cf1cc0557bdcc04f5e17a46e35d02d0d411d956dbd5d2d2464eebd7b74ae30005d223780d785d2abc5644fac7ac29fb0e302bdc80c81a5d45018b68b1045068a4b3a4861c93037685fd0d252d740501' testWithGanache('Validators Wrapper', (web3) => { const kit = newKitFromWeb3(web3) @@ -52,13 +48,12 @@ testWithGanache('Validators Wrapper', (web3) => { } const setupValidator = async (validatorAccount: string) => { + const publicKey = await addressToPublicKey(validatorAccount, web3.eth.sign) await registerAccountWithLockedGold(validatorAccount) // set account1 as the validator await validators - .registerValidator( - // @ts-ignore - publicKeysData - ) + // @ts-ignore + .registerValidator(publicKey, blsPublicKey, blsPoP) .sendAndWaitForReceipt({ from: validatorAccount }) } diff --git a/packages/contractkit/src/wrappers/Validators.ts b/packages/contractkit/src/wrappers/Validators.ts index 548f877d823..0cd4d737365 100644 --- a/packages/contractkit/src/wrappers/Validators.ts +++ b/packages/contractkit/src/wrappers/Validators.ts @@ -18,7 +18,8 @@ import { export interface Validator { address: Address - publicKey: string + ecdsaPublicKey: string + blsPublicKey: string affiliation: string | null score: BigNumber } @@ -57,7 +58,6 @@ export class ValidatorsWrapper extends BaseWrapper { this.contract.methods.updateCommission(toFixed(commission).toFixed()) ) } - updatePublicKeysData = proxySend(this.kit, this.contract.methods.updatePublicKeysData) /** * Returns the Locked Gold requirements for validators. * @returns The Locked Gold requirements for validators. @@ -100,9 +100,26 @@ export class ValidatorsWrapper extends BaseWrapper { async signerToAccount(signerAddress: Address) { const accounts = await this.kit.contracts.getAccounts() - return accounts.activeValidationSignerToAccount(signerAddress) + return accounts.validatorSignerToAccount(signerAddress) } + /** + * Updates a validator's BLS key. + * @param blsPublicKey The BLS public key that the validator is using for consensus, should pass proof + * of possession. 48 bytes. + * @param blsPop The BLS public key proof-of-possession, which consists of a signature on the + * account address. 96 bytes. + * @return True upon success. + */ + updateBlsPublicKey: ( + blsPublicKey: string, + blsPop: string + ) => CeloTransactionObject = proxySend( + this.kit, + this.contract.methods.updateBlsPublicKey, + tupleParser(parseBytes, parseBytes) + ) + /** * Returns whether a particular account has a registered validator. * @param account The account. @@ -147,9 +164,10 @@ export class ValidatorsWrapper extends BaseWrapper { const res = await this.contract.methods.getValidator(address).call() return { address, - publicKey: res[0] as any, - affiliation: res[1], - score: fromFixed(new BigNumber(res[2])), + ecdsaPublicKey: res[0] as any, + blsPublicKey: res[1] as any, + affiliation: res[2], + score: fromFixed(new BigNumber(res[3])), } } @@ -214,20 +232,23 @@ export class ValidatorsWrapper extends BaseWrapper { * Registers a validator unaffiliated with any validator group. * * Fails if the account is already a validator or validator group. - * Fails if the account does not have sufficient weight. * - * @param publicKeysData Comprised of three tightly-packed elements: - * - publicKey - The public key that the validator is using for consensus, should match - * msg.sender. 64 bytes. - * - blsPublicKey - The BLS public key that the validator is using for consensus, should pass - * proof of possession. 48 bytes. - * - blsPoP - The BLS public key proof of possession. 96 bytes. + * @param ecdsaPublicKey The ECDSA public key that the validator is using for consensus, should match + * the validator signer. 64 bytes. + * @param blsPublicKey The BLS public key that the validator is using for consensus, should pass proof + * of possession. 48 bytes. + * @param blsPop The BLS public key proof-of-possession, which consists of a signature on the + * account address. 96 bytes. */ - registerValidator: (publicKeysData: string) => CeloTransactionObject = proxySend( + registerValidator: ( + ecdsaPublicKey: string, + blsPublicKey: string, + blsPop: string + ) => CeloTransactionObject = proxySend( this.kit, this.contract.methods.registerValidator, - tupleParser(parseBytes) + tupleParser(parseBytes, parseBytes, parseBytes) ) /** diff --git a/packages/docs/command-line-interface/account.md b/packages/docs/command-line-interface/account.md index 91f4cd511cf..c22e3daa1e3 100644 --- a/packages/docs/command-line-interface/account.md +++ b/packages/docs/command-line-interface/account.md @@ -6,20 +6,23 @@ description: Manage your account, send and receive Celo Gold and Celo Dollars ### Authorize -Authorize an attestation, validation or vote signing key +Authorize an attestation, validator, or vote signer ``` USAGE $ celocli account:authorize OPTIONS - -r, --role=vote|validation|attestation Role to delegate - --from=0xc1912fEE45d61C87Cc5EA59DaE31190FFFFf232d (required) Account Address - --to=0xc1912fEE45d61C87Cc5EA59DaE31190FFFFf232d (required) Account Address + -r, --role=vote|validator|attestation (required) Role to delegate + --from=0xc1912fEE45d61C87Cc5EA59DaE31190FFFFf232d (required) Account Address + --pop=pop (required) Proof-of-possession of the signer key + --signer=0xc1912fEE45d61C87Cc5EA59DaE31190FFFFf232d (required) Account Address EXAMPLE - authorize --from 0x5409ED021D9299bf6814279A6A1411A7e866A631 --role vote --to - 0xc1912fEE45d61C87Cc5EA59DaE31190FFFFf232d + authorize --from 0x5409ED021D9299bf6814279A6A1411A7e866A631 --role vote --signer + 0x6ecbe1db9ef729cbe972c83fb886247691fb6beb --pop + 0x1b9fca4bbb5bfb1dbe69ef1cddbd9b4202dcb6b134c5170611e1e36ecfa468d7b46c85328d504934fce6c2a1571603a50ae224d2b32685e84d4d + 1a1eebad8452eb ``` _See code: [packages/cli/src/commands/account/authorize.ts](https://github.com/celo-org/celo-monorepo/tree/master/packages/cli/src/commands/account/authorize.ts)_ @@ -229,6 +232,25 @@ EXAMPLE _See code: [packages/cli/src/commands/account/new.ts](https://github.com/celo-org/celo-monorepo/tree/master/packages/cli/src/commands/account/new.ts)_ +### Proof-of-possession + +Generate proof-of-possession to be used to authorize a signer + +``` +USAGE + $ celocli account:proof-of-possession + +OPTIONS + --account=0xc1912fEE45d61C87Cc5EA59DaE31190FFFFf232d (required) Account Address + --signer=0xc1912fEE45d61C87Cc5EA59DaE31190FFFFf232d (required) Account Address + +EXAMPLE + proof-of-possession --account 0x5409ed021d9299bf6814279a6a1411a7e866a631 --signer + 0x6ecbe1db9ef729cbe972c83fb886247691fb6beb +``` + +_See code: [packages/cli/src/commands/account/proof-of-possession.ts](https://github.com/celo-org/celo-monorepo/tree/master/packages/cli/src/commands/account/proof-of-possession.ts)_ + ### Register Register an account @@ -239,10 +261,11 @@ USAGE OPTIONS --from=0xc1912fEE45d61C87Cc5EA59DaE31190FFFFf232d (required) Account Address - --name=name (required) + --name=name -EXAMPLE - register +EXAMPLES + register --from 0x5409ed021d9299bf6814279a6a1411a7e866a631 + register --from 0x5409ed021d9299bf6814279a6a1411a7e866a631 --name test-account ``` _See code: [packages/cli/src/commands/account/register.ts](https://github.com/celo-org/celo-monorepo/tree/master/packages/cli/src/commands/account/register.ts)_ diff --git a/packages/docs/command-line-interface/validator.md b/packages/docs/command-line-interface/validator.md index 308a79300f3..8bfdea3e57d 100644 --- a/packages/docs/command-line-interface/validator.md +++ b/packages/docs/command-line-interface/validator.md @@ -72,28 +72,6 @@ EXAMPLE _See code: [packages/cli/src/commands/validator/list.ts](https://github.com/celo-org/celo-monorepo/tree/master/packages/cli/src/commands/validator/list.ts)_ -### PublicKey - -Manage BLS public key data for a validator - -``` -USAGE - $ celocli validator:publicKey - -OPTIONS - --from=0xc1912fEE45d61C87Cc5EA59DaE31190FFFFf232d (required) Validator's address - --publicKey=0x (required) Public Key - -EXAMPLE - publickey --from 0x47e172F6CfB6c7D01C1574fa3E2Be7CC73269D95 --publicKey - 0xc52f3fab06e22a54915a8765c4f6826090cfac5e40282b43844bf1c0df83aaa632e55b67869758f2291d1aabe0ebecc7cbf4236aaa45e3e0cfbf - 997eda082ae19d3e1d8f49f6b0d8e9a03d80ca07b1d24cf1cc0557bdcc04f5e17a46e35d02d0d411d956dbd5d2d2464eebd7b74ae30005d223780d - 785d2abc5644fac7ac29fb0e302bdc80c81a5d45018b68b1045068a4b3a4861c93037685fd0d252d7405011220a66a6257562d0c26dabf64485a1d - 96bad27bb1c0fd6080a75b0ec9f75b50298a2a8e04b02b2688c8104fca61fb00 -``` - -_See code: [packages/cli/src/commands/validator/publicKey.ts](https://github.com/celo-org/celo-monorepo/tree/master/packages/cli/src/commands/validator/publicKey.ts)_ - ### Register Register a new Validator @@ -103,15 +81,18 @@ USAGE $ celocli validator:register OPTIONS + --blsKey=0x (required) BLS Public Key + --blsPop=0x (required) BLS Proof-of-Possession + --ecdsaKey=0x (required) ECDSA Public Key --from=0xc1912fEE45d61C87Cc5EA59DaE31190FFFFf232d (required) Address for the Validator - --publicKey=0x (required) Public Key EXAMPLE - register --from 0x47e172F6CfB6c7D01C1574fa3E2Be7CC73269D95 --publicKey + register --from 0x47e172F6CfB6c7D01C1574fa3E2Be7CC73269D95 --ecdsaKey 0xc52f3fab06e22a54915a8765c4f6826090cfac5e40282b43844bf1c0df83aaa632e55b67869758f2291d1aabe0ebecc7cbf4236aaa45e3e0cfbf - 997eda082ae19d3e1d8f49f6b0d8e9a03d80ca07b1d24cf1cc0557bdcc04f5e17a46e35d02d0d411d956dbd5d2d2464eebd7b74ae30005d223780d - 785d2abc5644fac7ac29fb0e302bdc80c81a5d45018b68b1045068a4b3a4861c93037685fd0d252d7405011220a66a6257562d0c26dabf64485a1d - 96bad27bb1c0fd6080a75b0ec9f75b50298a2a8e04b02b2688c8104fca61fb00 + 997eda082ae1 --blsKey + 0x9d3e1d8f49f6b0d8e9a03d80ca07b1d24cf1cc0557bdcc04f5e17a46e35d02d0d411d956dbd5d2d2464eebd7b74ae300 --blsPop + 0x05d223780d785d2abc5644fac7ac29fb0e302bdc80c81a5d45018b68b1045068a4b3a4861c93037685fd0d252d7405011220a66a6257562d0c26 + dabf64485a1d96bad27bb1c0fd6080a75b0ec9f75b50298a2a8e04b02b2688c8104fca61fb00 ``` _See code: [packages/cli/src/commands/validator/register.ts](https://github.com/celo-org/celo-monorepo/tree/master/packages/cli/src/commands/validator/register.ts)_ @@ -146,3 +127,25 @@ EXAMPLE ``` _See code: [packages/cli/src/commands/validator/show.ts](https://github.com/celo-org/celo-monorepo/tree/master/packages/cli/src/commands/validator/show.ts)_ + +### Update-bls-public-key + +Update BLS key for a validator + +``` +USAGE + $ celocli validator:update-bls-public-key + +OPTIONS + --blsKey=0x (required) BLS Public Key + --blsPop=0x (required) BLS Proof-of-Possession + --from=0xc1912fEE45d61C87Cc5EA59DaE31190FFFFf232d (required) Validator's address + +EXAMPLE + update-bls-key --from 0x47e172F6CfB6c7D01C1574fa3E2Be7CC73269D95 --blsKey + 0x9d3e1d8f49f6b0d8e9a03d80ca07b1d24cf1cc0557bdcc04f5e17a46e35d02d0d411d956dbd5d2d2464eebd7b74ae300 --blsPop + 0x05d223780d785d2abc5644fac7ac29fb0e302bdc80c81a5d45018b68b1045068a4b3a4861c93037685fd0d252d7405011220a66a6257562d0c26 + dabf64485a1d96bad27bb1c0fd6080a75b0ec9f75b50298a2a8e04b02b2688c8104fca61fb00 +``` + +_See code: [packages/cli/src/commands/validator/update-bls-public-key.ts](https://github.com/celo-org/celo-monorepo/tree/master/packages/cli/src/commands/validator/update-bls-public-key.ts)_ diff --git a/packages/mobile/src/identity/commentKey.ts b/packages/mobile/src/identity/commentKey.ts index 7dbae492aab..c54deaf486a 100644 --- a/packages/mobile/src/identity/commentKey.ts +++ b/packages/mobile/src/identity/commentKey.ts @@ -1,5 +1,5 @@ +import { stripHexLeader } from '@celo/utils/src/address' import { encryptComment as encryptCommentRaw } from '@celo/utils/src/commentEncryption' -import { stripHexLeader } from '@celo/utils/src/signatureUtils' import { getAttestationsContract, getDataEncryptionKey } from '@celo/walletkit' import { web3 } from 'src/web3/contracts' diff --git a/packages/mobile/src/identity/verification.ts b/packages/mobile/src/identity/verification.ts index 95405fd427d..3f1282a7455 100644 --- a/packages/mobile/src/identity/verification.ts +++ b/packages/mobile/src/identity/verification.ts @@ -1,6 +1,6 @@ +import { eqAddress } from '@celo/utils/src/address' import { compressedPubKey } from '@celo/utils/src/commentEncryption' import { getPhoneHash, isE164Number } from '@celo/utils/src/phoneNumbers' -import { areAddressesEqual } from '@celo/utils/src/signatureUtils' import { ActionableAttestation, extractAttestationCodeFromMessage, @@ -487,10 +487,7 @@ function* setAccount(attestationsContract: AttestationsType, address: string, da Logger.debug(TAG, 'Setting wallet address and public data encryption key') const currentWalletAddress = yield call(getWalletAddress, attestationsContract, address) const currentWalletDEK = yield call(getDataEncryptionKey, attestationsContract, address) - if ( - !areAddressesEqual(currentWalletAddress, address) || - !areAddressesEqual(currentWalletDEK, dataKey) - ) { + if (!eqAddress(currentWalletAddress, address) || !eqAddress(currentWalletDEK, dataKey)) { const setAccountTx = makeSetAccountTx(attestationsContract, address, dataKey) yield call(sendTransaction, setAccountTx, address, TAG, `Set Wallet Address & DEK`) CeloAnalytics.track(CustomEventNames.verification_set_account) diff --git a/packages/mobile/src/import/saga.ts b/packages/mobile/src/import/saga.ts index f3d40c96680..5be02a1c3bf 100644 --- a/packages/mobile/src/import/saga.ts +++ b/packages/mobile/src/import/saga.ts @@ -1,4 +1,4 @@ -import { ensureHexLeader } from '@celo/utils/src/signatureUtils' +import { ensureHexLeader } from '@celo/utils/src/address' import BigNumber from 'bignumber.js' import { validateMnemonic } from 'bip39' import { mnemonicToSeedHex } from 'react-native-bip39' diff --git a/packages/mobile/src/invite/saga.ts b/packages/mobile/src/invite/saga.ts index b19bc5b3d95..e6a16fc9238 100644 --- a/packages/mobile/src/invite/saga.ts +++ b/packages/mobile/src/invite/saga.ts @@ -1,5 +1,5 @@ +import { stripHexLeader } from '@celo/utils/src/address' import { getPhoneHash } from '@celo/utils/src/phoneNumbers' -import { stripHexLeader } from '@celo/utils/src/signatureUtils' import { getEscrowContract, getGoldTokenContract, getStableTokenContract } from '@celo/walletkit' import BigNumber from 'bignumber.js' import { Linking, Platform } from 'react-native' diff --git a/packages/mobile/src/qrcode/utils.ts b/packages/mobile/src/qrcode/utils.ts index a7f62532841..5e8adbc3e05 100644 --- a/packages/mobile/src/qrcode/utils.ts +++ b/packages/mobile/src/qrcode/utils.ts @@ -1,4 +1,4 @@ -import { isValidAddress } from '@celo/utils/src/signatureUtils' +import { isValidAddress } from '@celo/utils/src/address' import { isEmpty } from 'lodash' import * as RNFS from 'react-native-fs' import Share from 'react-native-share' diff --git a/packages/mobile/src/recipients/RecipientPicker.tsx b/packages/mobile/src/recipients/RecipientPicker.tsx index 9c0d72ce22d..b8fddb44e4e 100644 --- a/packages/mobile/src/recipients/RecipientPicker.tsx +++ b/packages/mobile/src/recipients/RecipientPicker.tsx @@ -8,8 +8,8 @@ import ForwardChevron from '@celo/react-components/icons/ForwardChevron' import QRCode from '@celo/react-components/icons/QRCode' import colors from '@celo/react-components/styles/colors' import { fontStyles } from '@celo/react-components/styles/fonts' +import { isValidAddress } from '@celo/utils/src/address' import { parsePhoneNumber } from '@celo/utils/src/phoneNumbers' -import { isValidAddress } from '@celo/utils/src/signatureUtils' import { TranslationFunction } from 'i18next' import * as React from 'react' import { withNamespaces, WithNamespaces } from 'react-i18next' diff --git a/packages/mobile/src/verify/VerificationCodeRow.tsx b/packages/mobile/src/verify/VerificationCodeRow.tsx index 548220d959d..98614ab767f 100644 --- a/packages/mobile/src/verify/VerificationCodeRow.tsx +++ b/packages/mobile/src/verify/VerificationCodeRow.tsx @@ -3,7 +3,7 @@ import withTextInputPasteAware from '@celo/react-components/components/WithTextI import Checkmark from '@celo/react-components/icons/Checkmark' import colors from '@celo/react-components/styles/colors' import fontStyles from '@celo/react-components/styles/fonts' -import { stripHexLeader } from '@celo/utils/src/signatureUtils' +import { stripHexLeader } from '@celo/utils/src/address' import { extractAttestationCodeFromMessage } from '@celo/walletkit' import * as React from 'react' import { withNamespaces, WithNamespaces } from 'react-i18next' diff --git a/packages/protocol/contracts/common/Accounts.sol b/packages/protocol/contracts/common/Accounts.sol index 027eba383e8..9e04877b836 100644 --- a/packages/protocol/contracts/common/Accounts.sol +++ b/packages/protocol/contracts/common/Accounts.sol @@ -1,7 +1,8 @@ pragma solidity ^0.5.3; -import "openzeppelin-solidity/contracts/utils/ReentrancyGuard.sol"; import "openzeppelin-solidity/contracts/math/SafeMath.sol"; +import "openzeppelin-solidity/contracts/ownership/Ownable.sol"; +import "openzeppelin-solidity/contracts/utils/ReentrancyGuard.sol"; import "./interfaces/IAccounts.sol"; @@ -9,21 +10,21 @@ import "../common/Initializable.sol"; import "../common/Signatures.sol"; import "../common/UsingRegistry.sol"; -contract Accounts is IAccounts, ReentrancyGuard, Initializable, UsingRegistry { +contract Accounts is IAccounts, Ownable, ReentrancyGuard, Initializable, UsingRegistry { using SafeMath for uint256; struct Signers { //The address that is authorized to vote in governance and validator elections on behalf of the // account. The account can vote as well, whether or not an vote signing key has been specified. - address voting; + address vote; // The address that is authorized to manage a validator or validator group and sign consensus // messages on behalf of the account. The account can manage the validator, whether or not an - // validation signing key has been specified. However if an validation signing key has been + // validator signing key has been specified. However if an validator signing key has been // specified, only that key may actually participate in consensus. - address validating; + address validator; // The address of the key with which this account wants to sign attestations on the Attestations // contract - address attesting; + address attestation; } struct Account { @@ -44,18 +45,23 @@ contract Accounts is IAccounts, ReentrancyGuard, Initializable, UsingRegistry { } mapping(address => Account) private accounts; - // Maps voting and validating keys to the account that provided the authorization. + // Maps authorized signers to the account that provided the authorization. mapping(address => address) public authorizedBy; event AttestationSignerAuthorized(address indexed account, address signer); event VoteSignerAuthorized(address indexed account, address signer); - event ValidationSignerAuthorized(address indexed account, address signer); + event ValidatorSignerAuthorized(address indexed account, address signer); event AccountDataEncryptionKeySet(address indexed account, bytes dataEncryptionKey); event AccountNameSet(address indexed account, string name); event AccountMetadataURLSet(address indexed account, string metadataURL); event AccountWalletAddressSet(address indexed account, address walletAddress); event AccountCreated(address indexed account); + function initialize(address registryAddress) external initializer { + _transferOwnership(msg.sender); + setRegistry(registryAddress); + } + /** * @notice Convenience Setter for the dataEncryptionKey and wallet address for an account * @param name A string to set as the name of the account @@ -73,6 +79,48 @@ contract Accounts is IAccounts, ReentrancyGuard, Initializable, UsingRegistry { setWalletAddress(walletAddress); } + /** + * @notice Creates an account. + * @return True if account creation succeeded. + */ + function createAccount() public returns (bool) { + require(isNotAccount(msg.sender) && isNotAuthorizedSigner(msg.sender)); + Account storage account = accounts[msg.sender]; + account.exists = true; + emit AccountCreated(msg.sender); + return true; + } + + /** + * @notice Setter for the name of an account. + * @param name The name to set. + */ + function setName(string memory name) public { + require(isAccount(msg.sender)); + accounts[msg.sender].name = name; + emit AccountNameSet(msg.sender, name); + } + + /** + * @notice Setter for the wallet address for an account + * @param walletAddress The wallet address to set for the account + */ + function setWalletAddress(address walletAddress) public { + require(isAccount(msg.sender)); + accounts[msg.sender].walletAddress = walletAddress; + emit AccountWalletAddressSet(msg.sender, walletAddress); + } + + /** + * @notice Setter for the data encryption key and version. + * @param dataEncryptionKey secp256k1 public key for data encryption. Preferably compressed. + */ + function setAccountDataEncryptionKey(bytes memory dataEncryptionKey) public { + require(dataEncryptionKey.length >= 33, "data encryption key length <= 32"); + accounts[msg.sender].dataEncryptionKey = dataEncryptionKey; + emit AccountDataEncryptionKeySet(msg.sender, dataEncryptionKey); + } + /** * @notice Setter for the metadata of an account. * @param metadataURL The URL to access the metadata. @@ -85,102 +133,179 @@ contract Accounts is IAccounts, ReentrancyGuard, Initializable, UsingRegistry { /** * @notice Authorizes an address to sign votes on behalf of the account. - * @param voter The address of the vote signing key to authorize. + * @param signer The address of the signing key to authorize. * @param v The recovery id of the incoming ECDSA signature. * @param r Output value r of the ECDSA signature. * @param s Output value s of the ECDSA signature. - * @dev v, r, s constitute `voter`'s signature on `msg.sender`. + * @dev v, r, s constitute `signer`'s signature on `msg.sender`. */ - function authorizeVoteSigner(address voter, uint8 v, bytes32 r, bytes32 s) external nonReentrant { + function authorizeVoteSigner(address signer, uint8 v, bytes32 r, bytes32 s) + external + nonReentrant + { Account storage account = accounts[msg.sender]; - authorize(voter, account.signers.voting, v, r, s); - account.signers.voting = voter; - emit VoteSignerAuthorized(msg.sender, voter); + authorize(signer, v, r, s); + account.signers.vote = signer; + emit VoteSignerAuthorized(msg.sender, signer); } /** * @notice Authorizes an address to sign consensus messages on behalf of the account. - * @param validator The address of the signing key to authorize. + * @param signer The address of the signing key to authorize. * @param v The recovery id of the incoming ECDSA signature. * @param r Output value r of the ECDSA signature. * @param s Output value s of the ECDSA signature. - * @dev v, r, s constitute `validator`'s signature on `msg.sender`. + * @dev v, r, s constitute `signer`'s signature on `msg.sender`. */ - function authorizeValidationSigner(address validator, uint8 v, bytes32 r, bytes32 s) + function authorizeValidatorSigner(address signer, uint8 v, bytes32 r, bytes32 s) external nonReentrant { Account storage account = accounts[msg.sender]; - authorize(validator, account.signers.validating, v, r, s); - account.signers.validating = validator; - emit ValidationSignerAuthorized(msg.sender, validator); + authorize(signer, v, r, s); + account.signers.validator = signer; + require(!getValidators().isValidator(msg.sender)); + emit ValidatorSignerAuthorized(msg.sender, signer); } /** - * @notice Check if an address has been authorized by an account for voting or validating. - * @param account The possibly authorized address. - * @return Returns `true` if authorized. Returns `false` otherwise. + * @notice Authorizes an address to sign consensus messages on behalf of the account. + * @param signer The address of the signing key to authorize. + * @param ecdsaPublicKey The ECDSA public key corresponding to `signer`. + * @param v The recovery id of the incoming ECDSA signature. + * @param r Output value r of the ECDSA signature. + * @param s Output value s of the ECDSA signature. + * @dev v, r, s constitute `signer`'s signature on `msg.sender`. */ - function isAuthorized(address account) external view returns (bool) { - return (authorizedBy[account] != address(0)); + function authorizeValidatorSigner( + address signer, + bytes calldata ecdsaPublicKey, + uint8 v, + bytes32 r, + bytes32 s + ) external nonReentrant { + Account storage account = accounts[msg.sender]; + authorize(signer, v, r, s); + account.signers.validator = signer; + require(getValidators().updateEcdsaPublicKey(msg.sender, signer, ecdsaPublicKey)); + emit ValidatorSignerAuthorized(msg.sender, signer); } /** - * @notice Returns the account associated with `accountOrAttestationSigner`. - * @param accountOrAttestationSigner The address of the account or active authorized attestation - signer. - * @dev Fails if the `accountOrAttestationSigner` is not an account or active authorized - attestation signer. + * @notice Authorizes an address to sign attestations on behalf of the account. + * @param signer The address of the signing key to authorize. + * @param v The recovery id of the incoming ECDSA signature. + * @param r Output value r of the ECDSA signature. + * @param s Output value s of the ECDSA signature. + * @dev v, r, s constitute `signer`'s signature on `msg.sender`. + */ + function authorizeAttestationSigner(address signer, uint8 v, bytes32 r, bytes32 s) public { + Account storage account = accounts[msg.sender]; + authorize(signer, v, r, s); + account.signers.attestation = signer; + emit AttestationSignerAuthorized(msg.sender, signer); + } + + /** + * @notice Returns the account associated with `signer`. + * @param signer The address of the account or currently authorized attestation signer. + * @dev Fails if the `signer` is not an account or currently authorized attestation signer. * @return The associated account. */ - function activeAttesttationSignerToAccount(address accountOrAttestationSigner) - external - view - returns (address) - { - address authorizingAccount = authorizedBy[accountOrAttestationSigner]; + function attestationSignerToAccount(address signer) external view returns (address) { + address authorizingAccount = authorizedBy[signer]; if (authorizingAccount != address(0)) { - require(accounts[authorizingAccount].signers.attesting == accountOrAttestationSigner); + require(accounts[authorizingAccount].signers.attestation == signer); return authorizingAccount; } else { - require(isAccount(accountOrAttestationSigner)); - return accountOrAttestationSigner; + require(isAccount(signer)); + return signer; } } /** - * @notice Returns the account associated with `accountOrVoteSigner`. - * @param accountOrVoteSigner The address of the account or active authorized vote signer. - * @dev Fails if the `accountOrVoteSigner` is not an account or active authorized vote signer. + * @notice Returns the account associated with `signer`. + * @param signer The address of an account or currently authorized validator signer. + * @dev Fails if the `signer` is not an account or currently authorized validator. * @return The associated account. */ - function activeVoteSignerToAccount(address accountOrVoteSigner) external view returns (address) { - address authorizingAccount = authorizedBy[accountOrVoteSigner]; + function validatorSignerToAccount(address signer) public view returns (address) { + address authorizingAccount = authorizedBy[signer]; if (authorizingAccount != address(0)) { - require(accounts[authorizingAccount].signers.voting == accountOrVoteSigner); + require(accounts[authorizingAccount].signers.validator == signer); return authorizingAccount; } else { - require(isAccount(accountOrVoteSigner)); - return accountOrVoteSigner; + require(isAccount(signer)); + return signer; } } /** - * @notice Returns the account associated with `accountOrVoteSigner`. - * @param accountOrVoteSigner The address of the account or previously authorized vote signer. - * @dev Fails if the `accountOrVoteSigner` is not an account or previously authorized vote signer. + * @notice Returns the account associated with `signer`. + * @param signer The address of the account or currently authorized vote signer. + * @dev Fails if the `signer` is not an account or currently authorized vote signer. * @return The associated account. */ - function voteSignerToAccount(address accountOrVoteSigner) external view returns (address) { - address authorizingAccount = authorizedBy[accountOrVoteSigner]; + function voteSignerToAccount(address signer) external view returns (address) { + address authorizingAccount = authorizedBy[signer]; if (authorizingAccount != address(0)) { + require(accounts[authorizingAccount].signers.vote == signer); return authorizingAccount; } else { - require(isAccount(accountOrVoteSigner)); - return accountOrVoteSigner; + require(isAccount(signer)); + return signer; } } + /** + * @notice Returns the account associated with `signer`. + * @param signer The address of the account or previously authorized signer. + * @dev Fails if the `signer` is not an account or previously authorized signer. + * @return The associated account. + */ + function signerToAccount(address signer) external view returns (address) { + address authorizingAccount = authorizedBy[signer]; + if (authorizingAccount != address(0)) { + return authorizingAccount; + } else { + require(isAccount(signer)); + return signer; + } + } + + /** + * @notice Returns the vote signer for the specified account. + * @param account The address of the account. + * @return The address with which the account can sign votes. + */ + function getVoteSigner(address account) public view returns (address) { + require(isAccount(account)); + address signer = accounts[account].signers.vote; + return signer == address(0) ? account : signer; + } + + /** + * @notice Returns the validator signer for the specified account. + * @param account The address of the account. + * @return The address with which the account can register a validator or group. + */ + function getValidatorSigner(address account) public view returns (address) { + require(isAccount(account)); + address signer = accounts[account].signers.validator; + return signer == address(0) ? account : signer; + } + + /** + * @notice Returns the attestation signer for the specified account. + * @param account The address of the account. + * @return The address with which the account can sign attestations. + */ + function getAttestationSigner(address account) public view returns (address) { + require(isAccount(account)); + address signer = accounts[account].signers.attestation; + return signer == address(0) ? account : signer; + } + /** * @notice Getter for the name of an account. * @param account The address of the account to get the name for. @@ -247,160 +372,6 @@ contract Accounts is IAccounts, ReentrancyGuard, Initializable, UsingRegistry { return accounts[account].walletAddress; } - /** - * @notice Creates an account. - * @return True if account creation succeeded. - */ - function createAccount() public returns (bool) { - require(isNotAccount(msg.sender) && isNotAuthorized(msg.sender)); - Account storage account = accounts[msg.sender]; - account.exists = true; - emit AccountCreated(msg.sender); - return true; - } - - /** - * @notice Setter for the name of an account. - * @param name The name to set. - */ - function setName(string memory name) public { - require(isAccount(msg.sender)); - accounts[msg.sender].name = name; - emit AccountNameSet(msg.sender, name); - } - - /** - * @notice Setter for the wallet address for an account - * @param walletAddress The wallet address to set for the account - */ - function setWalletAddress(address walletAddress) public { - require(isAccount(msg.sender)); - accounts[msg.sender].walletAddress = walletAddress; - emit AccountWalletAddressSet(msg.sender, walletAddress); - } - - /** - * @notice Setter for the data encryption key and version. - * @param dataEncryptionKey secp256k1 public key for data encryption. Preferably compressed. - */ - function setAccountDataEncryptionKey(bytes memory dataEncryptionKey) public { - require(dataEncryptionKey.length >= 33, "data encryption key length <= 32"); - accounts[msg.sender].dataEncryptionKey = dataEncryptionKey; - emit AccountDataEncryptionKeySet(msg.sender, dataEncryptionKey); - } - - /** - * @notice Authorizes an address to sign attestations on behalf of the account. - * @param attestor The address of the signing key to authorize. - * @param v The recovery id of the incoming ECDSA signature. - * @param r Output value r of the ECDSA signature. - * @param s Output value s of the ECDSA signature. - * @dev v, r, s constitute `attestor`'s signature on `msg.sender`. - */ - function authorizeAttestationSigner(address attestor, uint8 v, bytes32 r, bytes32 s) public { - Account storage account = accounts[msg.sender]; - authorize(attestor, account.signers.attesting, v, r, s); - account.signers.attesting = attestor; - emit AttestationSignerAuthorized(msg.sender, attestor); - } - - /** - * @notice Returns the account associated with `accountOrAttestationSigner`. - * @param accountOrAttestationSigner The address of the account or previously authorized - * attestation signing key. - * @dev Fails if the `accountOrAttestationSigner` is not an account or previously authorized - * attestation signing key. - * @return The associated account. - */ - function attestationSignerToAccount(address accountOrAttestationSigner) - public - view - returns (address) - { - address authorizingAccount = authorizedBy[accountOrAttestationSigner]; - if (authorizingAccount != address(0)) { - return authorizingAccount; - } else { - require(isAccount(accountOrAttestationSigner)); - return accountOrAttestationSigner; - } - } - - /** - * @notice Returns the account associated with `accountOrValidationSigner`. - * @param accountOrValidationSigner The address of the account or active authorized validator. - * @dev Fails if the `accountOrValidationSigner` is not an account or active authorized validator. - * @return The associated account. - */ - function activeValidationSignerToAccount(address accountOrValidationSigner) - public - view - returns (address) - { - address authorizingAccount = authorizedBy[accountOrValidationSigner]; - if (authorizingAccount != address(0)) { - require(accounts[authorizingAccount].signers.validating == accountOrValidationSigner); - return authorizingAccount; - } else { - require(isAccount(accountOrValidationSigner)); - return accountOrValidationSigner; - } - } - - /** - * @notice Returns the account associated with `accountOrValidationSigner`. - * @param accountOrValidationSigner The address of the account or previously authorized validator. - * @dev Fails if the `accountOrValidationSigner` is not an account or previously authorized - validator. - * @return The associated account. - */ - function validationSignerToAccount(address accountOrValidationSigner) - public - view - returns (address) - { - address authorizingAccount = authorizedBy[accountOrValidationSigner]; - if (authorizingAccount != address(0)) { - return authorizingAccount; - } else { - require(isAccount(accountOrValidationSigner)); - return accountOrValidationSigner; - } - } - - /** - * @notice Returns the vote signer for the specified account. - * @param account The address of the account. - * @return The address with which the account can sign votes. - */ - function getVoteSigner(address account) public view returns (address) { - require(isAccount(account)); - address voter = accounts[account].signers.voting; - return voter == address(0) ? account : voter; - } - - /** - * @notice Returns the validation signer for the specified account. - * @param account The address of the account. - * @return The address with which the account can register a validator or group. - */ - function getValidationSigner(address account) public view returns (address) { - require(isAccount(account)); - address validator = accounts[account].signers.validating; - return validator == address(0) ? account : validator; - } - - /** - * @notice Returns the attestation signer for the specified account. - * @param account The address of the account. - * @return The address with which the account can sign attestations. - */ - function getAttestationSigner(address account) public view returns (address) { - require(isAccount(account)); - address attestor = accounts[account].signers.attesting; - return attestor == address(0) ? account : attestor; - } - /** * @notice Check if an account already exists. * @param account The address of the account @@ -420,31 +391,39 @@ contract Accounts is IAccounts, ReentrancyGuard, Initializable, UsingRegistry { } /** - * @notice Check if an address has been authorized by an account for voting or validating. - * @param account The possibly authorized address. + * @notice Check if an address has been an authorized signer for an account. + * @param signer The possibly authorized address. + * @return Returns `true` if authorized. Returns `false` otherwise. + */ + function isAuthorizedSigner(address signer) external view returns (bool) { + return (authorizedBy[signer] != address(0)); + } + + /** + * @notice Check if an address has been an authorized signer for an account. + * @param signer The possibly authorized address. * @return Returns `false` if authorized. Returns `true` otherwise. */ - function isNotAuthorized(address account) internal view returns (bool) { - return (authorizedBy[account] == address(0)); + function isNotAuthorizedSigner(address signer) internal view returns (bool) { + return (authorizedBy[signer] == address(0)); } /** - * @notice Authorizes voting or validating power of `msg.sender`'s account to another address. - * @param current The address to authorize. - * @param previous The previous authorized address. + * @notice Authorizes some role of of `msg.sender`'s account to another address. + * @param authorized The address to authorize. * @param v The recovery id of the incoming ECDSA signature. * @param r Output value r of the ECDSA signature. * @param s Output value s of the ECDSA signature. * @dev Fails if the address is already authorized or is an account. + * @dev Note that once an address is authorized, it may never be authorized again. * @dev v, r, s constitute `current`'s signature on `msg.sender`. */ - function authorize(address current, address previous, uint8 v, bytes32 r, bytes32 s) private { - require(isAccount(msg.sender) && isNotAccount(current) && isNotAuthorized(current)); + function authorize(address authorized, uint8 v, bytes32 r, bytes32 s) private { + require(isAccount(msg.sender) && isNotAccount(authorized) && isNotAuthorizedSigner(authorized)); address signer = Signatures.getSignerOfAddress(msg.sender, v, r, s); - require(signer == current); + require(signer == authorized); - authorizedBy[previous] = address(0); - authorizedBy[current] = msg.sender; + authorizedBy[authorized] = msg.sender; } } diff --git a/packages/protocol/contracts/common/UsingPrecompiles.sol b/packages/protocol/contracts/common/UsingPrecompiles.sol index 4b93a055c67..542846af9a6 100644 --- a/packages/protocol/contracts/common/UsingPrecompiles.sol +++ b/packages/protocol/contracts/common/UsingPrecompiles.sol @@ -123,16 +123,20 @@ contract UsingPrecompiles { /** * @notice Checks a BLS proof of possession. - * @param proofOfPossessionBytes The public key and signature of the proof of possession. + * @param sender The address signed by the BLS key to generate the proof of possession. + * @param blsKey The BLS public key that the validator is using for consensus, should pass proof + * of possession. 48 bytes. + * @param blsPop The BLS public key proof-of-possession, which consists of a signature on the + * account address. 96 bytes. * @return True upon success. */ - function checkProofOfPossession(address sender, bytes memory proofOfPossessionBytes) + function checkProofOfPossession(address sender, bytes memory blsKey, bytes memory blsPop) public returns (bool) { bool success; (success, ) = PROOF_OF_POSSESSION.call.value(0).gas(gasleft())( - abi.encodePacked(sender, proofOfPossessionBytes) + abi.encodePacked(sender, blsKey, blsPop) ); return success; } diff --git a/packages/protocol/contracts/common/interfaces/IAccounts.sol b/packages/protocol/contracts/common/interfaces/IAccounts.sol index b197c66b549..0360e66394e 100644 --- a/packages/protocol/contracts/common/interfaces/IAccounts.sol +++ b/packages/protocol/contracts/common/interfaces/IAccounts.sol @@ -2,13 +2,11 @@ pragma solidity ^0.5.3; interface IAccounts { function isAccount(address) external view returns (bool); - function activeVoteSignerToAccount(address) external view returns (address); function voteSignerToAccount(address) external view returns (address); - function activeValidationSignerToAccount(address) external view returns (address); - function validationSignerToAccount(address) external view returns (address); - function getValidationSigner(address) external view returns (address); - function activeAttesttationSignerToAccount(address) external view returns (address); + function validatorSignerToAccount(address) external view returns (address); function attestationSignerToAccount(address) external view returns (address); + function signerToAccount(address) external view returns (address); + function getValidatorSigner(address) external view returns (address); function getAttestationSigner(address) external view returns (address); function setAccountDataEncryptionKey(bytes calldata) external; diff --git a/packages/protocol/contracts/governance/Election.sol b/packages/protocol/contracts/governance/Election.sol index 2ee97bc0e8d..c24bb9b6cbd 100644 --- a/packages/protocol/contracts/governance/Election.sol +++ b/packages/protocol/contracts/governance/Election.sol @@ -209,7 +209,7 @@ contract Election is require(votes.total.eligible.contains(group)); require(0 < value); require(canReceiveVotes(group, value)); - address account = getAccounts().activeVoteSignerToAccount(msg.sender); + address account = getAccounts().voteSignerToAccount(msg.sender); // Add group to the groups voted for by the account. address[] storage groups = votes.groupsVotedFor[account]; @@ -233,7 +233,7 @@ contract Election is * @dev Pending votes cannot be activated until an election has been held. */ function activate(address group) external nonReentrant returns (bool) { - address account = getAccounts().activeVoteSignerToAccount(msg.sender); + address account = getAccounts().voteSignerToAccount(msg.sender); PendingVote storage pendingVote = votes.pending.forGroup[group].byAccount[account]; require(pendingVote.epoch < getEpochNumber()); uint256 value = pendingVote.value; @@ -263,7 +263,7 @@ contract Election is uint256 index ) external nonReentrant returns (bool) { require(group != address(0)); - address account = getAccounts().activeVoteSignerToAccount(msg.sender); + address account = getAccounts().voteSignerToAccount(msg.sender); require(0 < value && value <= getPendingVotesForGroupByAccount(group, account)); decrementPendingVotes(group, account, value); decrementTotalVotes(group, value, lesser, greater); @@ -296,7 +296,7 @@ contract Election is ) external nonReentrant returns (bool) { // TODO(asa): Dedup with revokePending. require(group != address(0)); - address account = getAccounts().activeVoteSignerToAccount(msg.sender); + address account = getAccounts().voteSignerToAccount(msg.sender); require(0 < value && value <= getActiveVotesForGroupByAccount(group, account)); decrementActiveVotes(group, account, value); decrementTotalVotes(group, value, lesser, greater); @@ -706,7 +706,7 @@ contract Election is * @return The list of elected validators. * @dev See https://en.wikipedia.org/wiki/D%27Hondt_method#Allocation for more information. */ - function electValidators() external view returns (address[] memory) { + function electValidatorSigners() external view returns (address[] memory) { // Groups must have at least `electabilityThreshold` proportion of the total votes to be // considered for the election. uint256 requiredVotes = electabilityThreshold diff --git a/packages/protocol/contracts/governance/Governance.sol b/packages/protocol/contracts/governance/Governance.sol index 029aa8ee062..850a1dcb464 100644 --- a/packages/protocol/contracts/governance/Governance.sol +++ b/packages/protocol/contracts/governance/Governance.sol @@ -437,7 +437,7 @@ contract Governance is nonReentrant returns (bool) { - address account = getAccounts().activeVoteSignerToAccount(msg.sender); + address account = getAccounts().voteSignerToAccount(msg.sender); // TODO(asa): When upvoting a proposal that will get dequeued, should we let the tx succeed // and return false? dequeueProposalsIfReady(); @@ -484,7 +484,7 @@ contract Governance is */ function revokeUpvote(uint256 lesser, uint256 greater) external nonReentrant returns (bool) { dequeueProposalsIfReady(); - address account = getAccounts().activeVoteSignerToAccount(msg.sender); + address account = getAccounts().voteSignerToAccount(msg.sender); Voter storage voter = voters[account]; uint256 proposalId = voter.upvote.proposalId; Proposals.Proposal storage proposal = proposals[proposalId]; @@ -548,7 +548,7 @@ contract Governance is nonReentrant returns (bool) { - address account = getAccounts().activeVoteSignerToAccount(msg.sender); + address account = getAccounts().voteSignerToAccount(msg.sender); dequeueProposalsIfReady(); Proposals.Proposal storage proposal = proposals[proposalId]; require(isDequeuedProposal(proposal, proposalId, index)); diff --git a/packages/protocol/contracts/governance/Validators.sol b/packages/protocol/contracts/governance/Validators.sol index f5ef68f71b9..261fc914b8b 100644 --- a/packages/protocol/contracts/governance/Validators.sol +++ b/packages/protocol/contracts/governance/Validators.sol @@ -53,10 +53,6 @@ contract Validators is uint256 duration; } - // If we knew what time the validator was last in a group, we could enforce that to deregister a - // group, you need to have had 0 members for `duration`, and to deregister a validator, you need - // to have been out of a group for `duration`... - struct ValidatorGroup { bool exists; LinkedList.List members; @@ -85,8 +81,13 @@ contract Validators is uint256 lastRemovedFromGroupTimestamp; } + struct PublicKeys { + bytes ecdsa; + bytes bls; + } + struct Validator { - bytes publicKeysData; + PublicKeys publicKeys; address affiliation; FixidityLib.Fraction score; MembershipHistory membershipHistory; @@ -114,11 +115,12 @@ contract Validators is event GroupLockedGoldRequirementsSet(uint256 value, uint256 duration); event ValidatorLockedGoldRequirementsSet(uint256 value, uint256 duration); event MembershipHistoryLengthSet(uint256 length); - event ValidatorRegistered(address indexed validator, bytes publicKeysData); + event ValidatorRegistered(address indexed validator, bytes ecdsaPublicKey, bytes blsPublicKey); event ValidatorDeregistered(address indexed validator); event ValidatorAffiliated(address indexed validator, address indexed group); event ValidatorDeaffiliated(address indexed validator, address indexed group); - event ValidatorPublicKeysDataUpdated(address indexed validator, bytes publicKeysData); + event ValidatorEcdsaPublicKeyUpdated(address indexed validator, bytes ecdsaPublicKey); + event ValidatorBlsPublicKeyUpdated(address indexed validator, bytes blsPublicKey); event ValidatorGroupRegistered(address indexed group, uint256 commission); event ValidatorGroupDeregistered(address indexed group); event ValidatorGroupMemberAdded(address indexed group, address indexed validator); @@ -258,27 +260,32 @@ contract Validators is /** * @notice Registers a validator unaffiliated with any validator group. - * @param publicKeysData Comprised of three tightly-packed elements: - * - publicKey - The public key that the validator is using for consensus, should match - * msg.sender. 64 bytes. - * - blsPublicKey - The BLS public key that the validator is using for consensus, should pass - * proof of possession. 48 bytes. - * - blsPoP - The BLS public key proof of possession. 96 bytes. + * @param ecdsaPublicKey The ECDSA public key that the validator is using for consensus, should + * match the validator signer. 64 bytes. + * @param blsPublicKey The BLS public key that the validator is using for consensus, should pass + * proof of possession. 48 bytes. + * @param blsPop The BLS public key proof-of-possession, which consists of a signature on the + * account address. 96 bytes. * @return True upon success. * @dev Fails if the account is already a validator or validator group. * @dev Fails if the account does not have sufficient Locked Gold. */ - function registerValidator(bytes calldata publicKeysData) external nonReentrant returns (bool) { - address account = getAccounts().activeValidationSignerToAccount(msg.sender); + function registerValidator( + bytes calldata ecdsaPublicKey, + bytes calldata blsPublicKey, + bytes calldata blsPop + ) external nonReentrant returns (bool) { + address account = getAccounts().signerToAccount(msg.sender); require(!isValidator(account) && !isValidatorGroup(account)); uint256 lockedGoldBalance = getLockedGold().getAccountTotalLockedGold(account); require(lockedGoldBalance >= validatorLockedGoldRequirements.value); Validator storage validator = validators[account]; - _updatePublicKeysData(validator, publicKeysData); - validator.publicKeysData = publicKeysData; + address signer = getAccounts().getValidatorSigner(account); + _updateEcdsaPublicKey(validator, signer, ecdsaPublicKey); + _updateBlsPublicKey(validator, account, blsPublicKey, blsPop); registeredValidators.push(account); updateMembershipHistory(account, address(0)); - emit ValidatorRegistered(account, publicKeysData); + emit ValidatorRegistered(account, ecdsaPublicKey, blsPublicKey); return true; } @@ -313,23 +320,23 @@ contract Validators is /** * @notice Updates a validator's score based on its uptime for the epoch. - * @param validator The address of the validator. + * @param signer The validator signer of the validator account whose score needs updating. * @param uptime The Fixidity representation of the validator's uptime, between 0 and 1. * @return True upon success. */ - function updateValidatorScore(address validator, uint256 uptime) external onlyVm() { - _updateValidatorScore(validator, uptime); + function updateValidatorScoreFromSigner(address signer, uint256 uptime) external onlyVm() { + _updateValidatorScoreFromSigner(signer, uptime); } /** * @notice Updates a validator's score based on its uptime for the epoch. - * @param validator The address of the validator. + * @param signer The validator signer of the validator whose score needs updating. * @param uptime The Fixidity representation of the validator's uptime, between 0 and 1. * @dev new_score = uptime ** exponent * adjustmentSpeed + old_score * (1 - adjustmentSpeed) * @return True upon success. */ - function _updateValidatorScore(address validator, uint256 uptime) internal { - address account = getAccounts().validationSignerToAccount(validator); + function _updateValidatorScoreFromSigner(address signer, uint256 uptime) internal { + address account = getAccounts().signerToAccount(signer); require(isValidator(account)); require(uptime <= FixidityLib.fixed1().unwrap()); @@ -361,32 +368,32 @@ contract Validators is } /** - * @notice Distributes epoch payments to `validator` and its group. - * @param validator The validator to distribute the epoch payment to. + * @notice Distributes epoch payments to the account associated with `signer` and its group. + * @param signer The validator signer of the account to distribute the epoch payment to. * @param maxPayment The maximum payment to the validator. Actual payment is based on score and * group commission. * @return The total payment paid to the validator and their group. */ - function distributeEpochPayment(address validator, uint256 maxPayment) + function distributeEpochPaymentsFromSigner(address signer, uint256 maxPayment) external onlyVm() returns (uint256) { - return _distributeEpochPayment(validator, maxPayment); + return _distributeEpochPaymentsFromSigner(signer, maxPayment); } /** - * @notice Distributes epoch payments to `validator` and its group. - * @param validator The validator to distribute the epoch payment to. + * @notice Distributes epoch payments to the account associated with `signer` and its group. + * @param signer The validator signer of the validator to distribute the epoch payment to. * @param maxPayment The maximum payment to the validator. Actual payment is based on score and * group commission. * @return The total payment paid to the validator and their group. */ - function _distributeEpochPayment(address validator, uint256 maxPayment) + function _distributeEpochPaymentsFromSigner(address signer, uint256 maxPayment) internal returns (uint256) { - address account = getAccounts().validationSignerToAccount(validator); + address account = getAccounts().signerToAccount(signer); require(isValidator(account)); // The group that should be paid is the group that the validator was a member of at the // time it was elected. @@ -414,7 +421,7 @@ contract Validators is * @dev Fails if the account is not a validator. */ function deregisterValidator(uint256 index) external nonReentrant returns (bool) { - address account = getAccounts().activeValidationSignerToAccount(msg.sender); + address account = getAccounts().signerToAccount(msg.sender); require(isValidator(account)); // Require that the validator has not been a member of a validator group for @@ -442,7 +449,7 @@ contract Validators is * @dev De-affiliates with the previously affiliated group if present. */ function affiliate(address group) external nonReentrant returns (bool) { - address account = getAccounts().activeValidationSignerToAccount(msg.sender); + address account = getAccounts().signerToAccount(msg.sender); require(isValidator(account) && isValidatorGroup(group)); require(meetsAccountLockedGoldRequirements(account)); require(meetsAccountLockedGoldRequirements(group)); @@ -461,7 +468,7 @@ contract Validators is * @dev Fails if the account is not a validator with non-zero affiliation. */ function deaffiliate() external nonReentrant returns (bool) { - address account = getAccounts().activeValidationSignerToAccount(msg.sender); + address account = getAccounts().signerToAccount(msg.sender); require(isValidator(account)); Validator storage validator = validators[account]; require(validator.affiliation != address(0)); @@ -470,46 +477,86 @@ contract Validators is } /** - * @notice Updates a validator's public keys data. - * @param publicKeysData Comprised of three tightly-packed elements: - * - publicKey - The public key that the validator is using for consensus, should match - * msg.sender. 64 bytes. - * - blsPublicKey - The BLS public key that the validator is using for consensus, should pass - * proof of possession. 48 bytes. - * - blsPoP - The BLS public key proof of possession. 96 bytes. + * @notice Updates a validator's BLS key. + * @param blsPublicKey The BLS public key that the validator is using for consensus, should pass + * proof of possession. 48 bytes. + * @param blsPop The BLS public key proof-of-possession, which consists of a signature on the + * account address. 96 bytes. * @return True upon success. */ - function updatePublicKeysData(bytes calldata publicKeysData) external returns (bool) { - address account = getAccounts().activeValidationSignerToAccount(msg.sender); + function updateBlsPublicKey(bytes calldata blsPublicKey, bytes calldata blsPop) + external + returns (bool) + { + address account = getAccounts().signerToAccount(msg.sender); require(isValidator(account)); Validator storage validator = validators[account]; - _updatePublicKeysData(validator, publicKeysData); - emit ValidatorPublicKeysDataUpdated(account, publicKeysData); + _updateBlsPublicKey(validator, account, blsPublicKey, blsPop); + emit ValidatorBlsPublicKeyUpdated(account, blsPublicKey); return true; } /** - * @notice Updates a validator's public keys data. - * @param validator The validator whose public keys data should be updated. - * @param publicKeysData Comprised of three tightly-packed elements: - * - publicKey - The public key that the validator is using for consensus, should match - * msg.sender. 64 bytes. - * - blsPublicKey - The BLS public key that the validator is using for consensus, should pass - * proof of possession. 48 bytes. - * - blsPoP - The BLS public key proof of possession. 96 bytes. + * @notice Updates a validator's BLS key. + * @param validator The validator whose BLS public key should be updated. + * @param account The address under which the validator is registered. + * @param blsPublicKey The BLS public key that the validator is using for consensus, should pass + * proof of possession. 48 bytes. + * @param blsPop The BLS public key proof-of-possession, which consists of a signature on the + * account address. 96 bytes. * @return True upon success. */ - function _updatePublicKeysData(Validator storage validator, bytes memory publicKeysData) - private + function _updateBlsPublicKey( + Validator storage validator, + address account, + bytes memory blsPublicKey, + bytes memory blsPop + ) private returns (bool) { + require(blsPublicKey.length == 48); + require(blsPop.length == 96); + require(checkProofOfPossession(account, blsPublicKey, blsPop)); + validator.publicKeys.bls = blsPublicKey; + return true; + } + + /** + * @notice Updates a validator's ECDSA key. + * @param account The address under which the validator is registered. + * @param signer The address which the validator is using to sign consensus messages. + * @param ecdsaPublicKey The ECDSA public key corresponding to `signer`. + * @return True upon success. + */ + function updateEcdsaPublicKey(address account, address signer, bytes calldata ecdsaPublicKey) + external + onlyRegisteredContract(ACCOUNTS_REGISTRY_ID) returns (bool) { + require(isValidator(account)); + Validator storage validator = validators[account]; + require(_updateEcdsaPublicKey(validator, signer, ecdsaPublicKey)); + emit ValidatorEcdsaPublicKeyUpdated(account, ecdsaPublicKey); + return true; + } + + /** + * @notice Updates a validator's ECDSA key. + * @param validator The validator whose ECDSA public key should be updated. + * @param signer The address with which the validator is signing consensus messages. + * @param ecdsaPublicKey The ECDSA public key that the validator is using for consensus. Should + * match `signer`. 64 bytes. + * @return True upon success. + */ + function _updateEcdsaPublicKey( + Validator storage validator, + address signer, + bytes memory ecdsaPublicKey + ) private returns (bool) { + require(ecdsaPublicKey.length == 64); require( - // secp256k1 public key + BLS public key + BLS proof of possession - publicKeysData.length == (64 + 48 + 96) + address(uint160(uint256(keccak256(ecdsaPublicKey)))) == signer, + "ECDSA key does not match signer" ); - // Use the proof of possession bytes - require(checkProofOfPossession(msg.sender, publicKeysData.slice(64, 48 + 96))); - validator.publicKeysData = publicKeysData; + validator.publicKeys.ecdsa = ecdsaPublicKey; return true; } @@ -523,7 +570,7 @@ contract Validators is */ function registerValidatorGroup(uint256 commission) external nonReentrant returns (bool) { require(commission <= FixidityLib.fixed1().unwrap(), "Commission can't be greater than 100%"); - address account = getAccounts().activeValidationSignerToAccount(msg.sender); + address account = getAccounts().signerToAccount(msg.sender); require(!isValidator(account) && !isValidatorGroup(account)); uint256 lockedGoldBalance = getLockedGold().getAccountTotalLockedGold(account); require(lockedGoldBalance >= groupLockedGoldRequirements.value); @@ -542,7 +589,7 @@ contract Validators is * @dev Fails if the account is not a validator group with no members. */ function deregisterValidatorGroup(uint256 index) external nonReentrant returns (bool) { - address account = getAccounts().activeValidationSignerToAccount(msg.sender); + address account = getAccounts().signerToAccount(msg.sender); // Only Validator Groups that have never had members or have been empty for at least // `groupLockedGoldRequirements.duration` seconds can be deregistered. require(isValidatorGroup(account) && groups[account].members.numElements == 0); @@ -564,7 +611,7 @@ contract Validators is * @dev Fails if the group has zero members. */ function addMember(address validator) external nonReentrant returns (bool) { - address account = getAccounts().activeValidationSignerToAccount(msg.sender); + address account = getAccounts().signerToAccount(msg.sender); require(groups[account].members.numElements > 0); return _addMember(account, validator, address(0), address(0)); } @@ -583,7 +630,7 @@ contract Validators is nonReentrant returns (bool) { - address account = getAccounts().activeValidationSignerToAccount(msg.sender); + address account = getAccounts().signerToAccount(msg.sender); require(groups[account].members.numElements == 0); return _addMember(account, validator, lesser, greater); } @@ -626,7 +673,7 @@ contract Validators is * @dev Fails if `validator` is not a member of the account's group. */ function removeMember(address validator) external nonReentrant returns (bool) { - address account = getAccounts().activeValidationSignerToAccount(msg.sender); + address account = getAccounts().signerToAccount(msg.sender); require(isValidatorGroup(account) && isValidator(validator), "is not group and validator"); return _removeMember(account, validator); } @@ -646,7 +693,7 @@ contract Validators is nonReentrant returns (bool) { - address account = getAccounts().activeValidationSignerToAccount(msg.sender); + address account = getAccounts().signerToAccount(msg.sender); require(isValidatorGroup(account) && isValidator(validator)); ValidatorGroup storage group = groups[account]; require(group.members.contains(validator)); @@ -662,7 +709,7 @@ contract Validators is * @return True upon success. */ function updateCommission(uint256 commission) external returns (bool) { - address account = getAccounts().activeValidationSignerToAccount(msg.sender); + address account = getAccounts().signerToAccount(msg.sender); require(isValidatorGroup(account)); ValidatorGroup storage group = groups[account]; require(commission <= FixidityLib.fixed1().unwrap(), "Commission can't be greater than 100%"); @@ -706,19 +753,44 @@ contract Validators is return balance >= getAccountLockedGoldRequirement(account); } + /** + * @notice Returns the validator BLS key. + * @param signer The account that registered the validator or its authorized signing address. + * @return The validator BLS key. + */ + function getValidatorBlsPublicKeyFromSigner(address signer) + external + view + returns (bytes memory blsPublicKey) + { + address account = getAccounts().signerToAccount(signer); + require(isValidator(account)); + return validators[account].publicKeys.bls; + } + /** * @notice Returns validator information. * @param account The account that registered the validator. * @return The unpacked validator struct. */ function getValidator(address account) - external + public view - returns (bytes memory publicKeysData, address affiliation, uint256 score) + returns ( + bytes memory ecdsaPublicKey, + bytes memory blsPublicKey, + address affiliation, + uint256 score + ) { require(isValidator(account)); Validator storage validator = validators[account]; - return (validator.publicKeysData, validator.affiliation, validator.score.unwrap()); + return ( + validator.publicKeys.ecdsa, + validator.publicKeys.bls, + validator.affiliation, + validator.score.unwrap() + ); } /** @@ -760,7 +832,7 @@ contract Validators is address[] memory topAccounts = groups[account].members.headN(n); address[] memory topValidators = new address[](n); for (uint256 i = 0; i < n; i = i.add(1)) { - topValidators[i] = getAccounts().getValidationSigner(topAccounts[i]); + topValidators[i] = getAccounts().getValidatorSigner(topAccounts[i]); } return topValidators; } @@ -814,6 +886,19 @@ contract Validators is return registeredValidators; } + /** + * @notice Returns the list of signers for the registered validator accounts. + * @return The list of signers for registered validator accounts. + */ + function getRegisteredValidatorSigners() external view returns (address[] memory) { + IAccounts accounts = getAccounts(); + address[] memory signers = new address[](registeredValidators.length); + for (uint256 i = 0; i < signers.length; i = i.add(1)) { + signers[i] = accounts.getValidatorSigner(registeredValidators[i]); + } + return signers; + } + /** * @notice Returns the list of registered validator group accounts. * @return The list of registered validator group addresses. @@ -837,7 +922,7 @@ contract Validators is * @return Whether a particular address is a registered validator. */ function isValidator(address account) public view returns (bool) { - return validators[account].publicKeysData.length > 0; + return validators[account].publicKeys.bls.length > 0; } /** @@ -921,6 +1006,12 @@ contract Validators is return true; } + /** + * @notice Updates the size history of a validator group. + * @param group The account whose group size has changed. + * @param size The new size of the group. + * @dev Used to determine how much gold an account needs to keep locked. + */ function updateSizeHistory(address group, uint256 size) private { uint256[] storage sizeHistory = groups[group].sizeHistory; if (size == sizeHistory.length) { @@ -932,6 +1023,17 @@ contract Validators is } } + /** + * @notice Returns the group that `account` was a member of at the end of the last epoch. + * @param signer The signer of the account whose group membership should be returned. + * @return The group that `account` was a member of at the end of the last epoch. + */ + function getMembershipInLastEpochFromSigner(address signer) external view returns (address) { + address account = getAccounts().signerToAccount(signer); + require(isValidator(account)); + return getMembershipInLastEpoch(account); + } + /** * @notice Returns the group that `account` was a member of at the end of the last epoch. * @param account The account whose group membership should be returned. diff --git a/packages/protocol/contracts/governance/interfaces/IElection.sol b/packages/protocol/contracts/governance/interfaces/IElection.sol index 55c545b0d21..ea20aa76978 100644 --- a/packages/protocol/contracts/governance/interfaces/IElection.sol +++ b/packages/protocol/contracts/governance/interfaces/IElection.sol @@ -6,5 +6,5 @@ interface IElection { function getTotalVotesByAccount(address) external view returns (uint256); function markGroupIneligible(address) external; function markGroupEligible(address, address, address) external; - function electValidators() external view returns (address[] memory); + function electValidatorSigners() external view returns (address[] memory); } diff --git a/packages/protocol/contracts/governance/interfaces/IValidators.sol b/packages/protocol/contracts/governance/interfaces/IValidators.sol index 80906504a03..fcb6e3cd1ef 100644 --- a/packages/protocol/contracts/governance/interfaces/IValidators.sol +++ b/packages/protocol/contracts/governance/interfaces/IValidators.sol @@ -7,4 +7,6 @@ interface IValidators { function getGroupsNumMembers(address[] calldata) external view returns (uint256[] memory); function getNumRegisteredValidators() external view returns (uint256); function getTopGroupValidators(address, uint256) external view returns (address[] memory); + function updateEcdsaPublicKey(address, address, bytes calldata) external returns (bool); + function isValidator(address) external view returns (bool); } diff --git a/packages/protocol/contracts/governance/test/MockElection.sol b/packages/protocol/contracts/governance/test/MockElection.sol index ddc157abe79..f39b470ba0f 100644 --- a/packages/protocol/contracts/governance/test/MockElection.sol +++ b/packages/protocol/contracts/governance/test/MockElection.sol @@ -44,7 +44,7 @@ contract MockElection is IElection { electedValidators = _electedValidators; } - function electValidators() external view returns (address[] memory) { + function electValidatorSigners() external view returns (address[] memory) { return electedValidators; } } diff --git a/packages/protocol/contracts/governance/test/MockValidators.sol b/packages/protocol/contracts/governance/test/MockValidators.sol index 0eb1c902fb3..aa2406f8e0f 100644 --- a/packages/protocol/contracts/governance/test/MockValidators.sol +++ b/packages/protocol/contracts/governance/test/MockValidators.sol @@ -6,42 +6,33 @@ import "../interfaces/IValidators.sol"; * @title Holds a list of addresses of validators */ contract MockValidators is IValidators { - mapping(address => bool) private _isValidating; - mapping(address => bool) private _isVoting; + mapping(address => bool) public isValidator; mapping(address => uint256) private numGroupMembers; mapping(address => uint256) private lockedGoldRequirements; mapping(address => bool) private doesNotMeetAccountLockedGoldRequirements; mapping(address => address[]) private members; uint256 private numRegisteredValidators; - function setDoesNotMeetAccountLockedGoldRequirements(address account) external { - doesNotMeetAccountLockedGoldRequirements[account] = true; + function updateEcdsaPublicKey(address, address, bytes calldata) external returns (bool) { + return true; } - function meetsAccountLockedGoldRequirements(address account) external view returns (bool) { - return !doesNotMeetAccountLockedGoldRequirements[account]; + function setValidator(address account) external { + isValidator[account] = true; } - function isValidating(address account) external view returns (bool) { - return _isValidating[account]; + function setDoesNotMeetAccountLockedGoldRequirements(address account) external { + doesNotMeetAccountLockedGoldRequirements[account] = true; } - function isVoting(address account) external view returns (bool) { - return _isVoting[account]; + function meetsAccountLockedGoldRequirements(address account) external view returns (bool) { + return !doesNotMeetAccountLockedGoldRequirements[account]; } function getGroupNumMembers(address group) public view returns (uint256) { return members[group].length; } - function setValidating(address account) external { - _isValidating[account] = true; - } - - function setVoting(address account) external { - _isVoting[account] = true; - } - function setNumRegisteredValidators(uint256 value) external { numRegisteredValidators = value; } diff --git a/packages/protocol/contracts/governance/test/ValidatorsTest.sol b/packages/protocol/contracts/governance/test/ValidatorsTest.sol index a049ddc6efb..86af7f26a3b 100644 --- a/packages/protocol/contracts/governance/test/ValidatorsTest.sol +++ b/packages/protocol/contracts/governance/test/ValidatorsTest.sol @@ -7,14 +7,14 @@ import "../../common/FixidityLib.sol"; * @title A wrapper around Validators that exposes onlyVm functions for testing. */ contract ValidatorsTest is Validators { - function updateValidatorScore(address validator, uint256 uptime) external { - return _updateValidatorScore(validator, uptime); + function updateValidatorScoreFromSigner(address signer, uint256 uptime) external { + return _updateValidatorScoreFromSigner(signer, uptime); } - function distributeEpochPayment(address validator, uint256 maxPayment) + function distributeEpochPaymentsFromSigner(address signer, uint256 maxPayment) external returns (uint256) { - return _distributeEpochPayment(validator, maxPayment); + return _distributeEpochPaymentsFromSigner(signer, maxPayment); } } diff --git a/packages/protocol/contracts/identity/Attestations.sol b/packages/protocol/contracts/identity/Attestations.sol index c3758e906b0..fc4287a77e6 100644 --- a/packages/protocol/contracts/identity/Attestations.sol +++ b/packages/protocol/contracts/identity/Attestations.sol @@ -501,7 +501,7 @@ contract Attestations is ) public view returns (address) { bytes32 codehash = keccak256(abi.encodePacked(identifier, account)); address signer = Signatures.getSignerOfMessageHash(codehash, v, r, s); - address issuer = getAccounts().activeAttesttationSignerToAccount(signer); + address issuer = getAccounts().attestationSignerToAccount(signer); Attestation storage attestation = identifiers[identifier].attestations[account] .issuedAttestations[issuer]; @@ -570,7 +570,7 @@ contract Attestations is while (currentIndex < unselectedRequest.attestationsRequested) { seed = keccak256(abi.encodePacked(seed)); validator = validatorAddressFromCurrentSet(uint256(seed) % numberValidators); - issuer = getAccounts().activeValidationSignerToAccount(validator); + issuer = getAccounts().validatorSignerToAccount(validator); Attestation storage attestation = state.issuedAttestations[issuer]; // Attestation issuers can only be added if they haven't been already. diff --git a/packages/protocol/lib/test-utils.ts b/packages/protocol/lib/test-utils.ts index 812669b0f5a..0605852eaed 100644 --- a/packages/protocol/lib/test-utils.ts +++ b/packages/protocol/lib/test-utils.ts @@ -34,30 +34,6 @@ export function assertContainSubset(superset: any, subset: any) { return assert2.containSubset(superset, subset) } -export async function advanceBlockNum(numBlocks: number, web3: Web3) { - let returnValue: any - for (let i: number = 0; i < numBlocks; i++) { - returnValue = new Promise((resolve, reject) => { - web3.currentProvider.send( - { - jsonrpc: '2.0', - method: 'evm_mine', - params: [], - id: new Date().getTime(), - }, - // @ts-ignore - (err: any, result: any) => { - if (err) { - return reject(err) - } - return resolve(result) - } - ) - }) - } - return returnValue -} - export async function jsonRpc(web3: Web3, method: string, params: any[] = []): Promise { return new Promise((resolve, reject) => { web3.currentProvider.send( @@ -342,7 +318,6 @@ export const matchAny = () => { } export default { - advanceBlockNum, assertContainSubset, assertRevert, timeTravel, diff --git a/packages/protocol/lib/web3-utils.ts b/packages/protocol/lib/web3-utils.ts index d5b96f21e8e..b7dc2624564 100644 --- a/packages/protocol/lib/web3-utils.ts +++ b/packages/protocol/lib/web3-utils.ts @@ -3,41 +3,20 @@ import { setAndInitializeImplementation } from '@celo/protocol/lib/proxy-utils' import { CeloContractName } from '@celo/protocol/lib/registry-utils' import { signTransaction } from '@celo/protocol/lib/signing-utils' +import { privateKeyToAddress } from '@celo/utils/lib/address' import { BigNumber } from 'bignumber.js' -import { ec as EC } from 'elliptic' import { EscrowInstance, GoldTokenInstance, MultiSigInstance, OwnableInstance, ProxyContract, ProxyInstance, RegistryInstance, StableTokenInstance } from 'types' import { TransactionObject } from 'web3/eth/types' import Web3 = require('web3') -const ec = new EC('secp256k1') -const cachedWeb3 = new Web3() - -export function add0x(str: string) { - return '0x' + str -} - -export function generatePublicKeyFromPrivateKey(privateKey: string) { - const ecPrivateKey = ec.keyFromPrivate(Buffer.from(privateKey, 'hex')) - const ecPublicKey: string = ecPrivateKey.getPublic('hex') - return ecPublicKey.slice(2) -} - -export function generateAccountAddressFromPrivateKey(privateKey: string) { - if (!privateKey.startsWith('0x')) { - privateKey = '0x' + privateKey - } - // @ts-ignore-next-line - return cachedWeb3.eth.accounts.privateKeyToAccount(privateKey).address -} - export async function sendTransactionWithPrivateKey( web3: Web3, tx: TransactionObject, privateKey: string, txArgs: any ) { - const address = generateAccountAddressFromPrivateKey(privateKey.slice(2)) + const address = privateKeyToAddress(privateKey) const encodedTxData = tx.encodeABI() const estimatedGas = await tx.estimateGas({ ...txArgs, diff --git a/packages/protocol/migrations/10_accounts.ts b/packages/protocol/migrations/10_accounts.ts index 4a9542cdc76..592087734c8 100644 --- a/packages/protocol/migrations/10_accounts.ts +++ b/packages/protocol/migrations/10_accounts.ts @@ -1,9 +1,21 @@ import { CeloContractName } from '@celo/protocol/lib/registry-utils' -import { deploymentForCoreContract } from '@celo/protocol/lib/web3-utils' -import { AccountsInstance } from 'types' +import { + deploymentForCoreContract, + getDeployedProxiedContract, +} from '@celo/protocol/lib/web3-utils' +import { AccountsInstance, RegistryInstance } from 'types' + +const initializeArgs = async (): Promise<[string]> => { + const registry: RegistryInstance = await getDeployedProxiedContract( + 'Registry', + artifacts + ) + return [registry.address] +} module.exports = deploymentForCoreContract( web3, artifacts, - CeloContractName.Accounts + CeloContractName.Accounts, + initializeArgs ) diff --git a/packages/protocol/migrations/20_elect_validators.ts b/packages/protocol/migrations/20_elect_validators.ts index a42077e0ba2..24baec893e4 100644 --- a/packages/protocol/migrations/20_elect_validators.ts +++ b/packages/protocol/migrations/20_elect_validators.ts @@ -1,17 +1,14 @@ /* tslint:disable:no-console */ import { NULL_ADDRESS } from '@celo/protocol/lib/test-utils' import { - add0x, - generateAccountAddressFromPrivateKey, - generatePublicKeyFromPrivateKey, getDeployedProxiedContract, sendTransactionWithPrivateKey, } from '@celo/protocol/lib/web3-utils' import { config } from '@celo/protocol/migrationsConfig' -import { blsPrivateKeyToProcessedPrivateKey } from '@celo/utils/lib/bls' +import { privateKeyToAddress, privateKeyToPublicKey } from '@celo/utils/lib/address' +import { getBlsPoP, getBlsPublicKey } from '@celo/utils/lib/bls' import { toFixed } from '@celo/utils/lib/fixidity' import { BigNumber } from 'bignumber.js' -import * as bls12377js from 'bls12377js' import { AccountsInstance, ElectionInstance, LockedGoldInstance, ValidatorsInstance } from 'types' const Web3 = require('web3') @@ -66,7 +63,7 @@ async function registerValidatorGroup( ) await web3.eth.sendTransaction({ - from: generateAccountAddressFromPrivateKey(privateKey.slice(0)), + from: privateKeyToAddress(privateKey), to: account.address, value: lockedGoldValue.times(1.01).toFixed(), // Add a premium to cover tx fees }) @@ -102,21 +99,6 @@ async function registerValidator( index: number, networkName: string ) { - const validatorPrivateKeyHexStripped = validatorPrivateKey.slice(2) - const address = generateAccountAddressFromPrivateKey(validatorPrivateKey) - const publicKey = generatePublicKeyFromPrivateKey(validatorPrivateKeyHexStripped) - const blsValidatorPrivateKeyBytes = blsPrivateKeyToProcessedPrivateKey( - validatorPrivateKeyHexStripped - ) - const blsPublicKey = bls12377js.BLS.privateToPublicBytes(blsValidatorPrivateKeyBytes).toString( - 'hex' - ) - const blsPoP = bls12377js.BLS.signPoP( - blsValidatorPrivateKeyBytes, - Buffer.from(address.slice(2), 'hex') - ).toString('hex') - const publicKeysData = publicKey + blsPublicKey + blsPoP - await lockGold( accounts, lockedGold, @@ -130,8 +112,12 @@ async function registerValidator( to: accounts.address, }) + const publicKey = privateKeyToPublicKey(validatorPrivateKey) + const blsPublicKey = getBlsPublicKey(validatorPrivateKey) + const blsPoP = getBlsPoP(privateKeyToAddress(validatorPrivateKey), validatorPrivateKey) + // @ts-ignore - const registerTx = validators.contract.methods.registerValidator(add0x(publicKeysData)) + const registerTx = validators.contract.methods.registerValidator(publicKey, blsPublicKey, blsPoP) await sendTransactionWithPrivateKey(web3, registerTx, validatorPrivateKey, { to: validators.address, @@ -146,7 +132,7 @@ async function registerValidator( // @ts-ignore const registerDataEncryptionKeyTx = accounts.contract.methods.setAccountDataEncryptionKey( - add0x(publicKey) + privateKeyToPublicKey(validatorPrivateKey) ) await sendTransactionWithPrivateKey(web3, registerDataEncryptionKeyTx, validatorPrivateKey, { @@ -216,7 +202,7 @@ module.exports = async (_deployer: any, networkName: string) => { console.info(' Adding Validators to Validator Group ...') for (let i = 0; i < valKeys.length; i++) { const key = valKeys[i] - const address = generateAccountAddressFromPrivateKey(key.slice(2)) + const address = privateKeyToAddress(key) if (i === 0) { // @ts-ignore const addTx = validators.contract.methods.addFirstMember(address, NULL_ADDRESS, NULL_ADDRESS) diff --git a/packages/protocol/package.json b/packages/protocol/package.json index fb42227a875..1e3b6884ec9 100644 --- a/packages/protocol/package.json +++ b/packages/protocol/package.json @@ -43,7 +43,6 @@ "@0x/subproviders": "^5.0.0", "@celo/utils": "^0.1.0", "apollo-client": "^2.4.13", - "bls12377js": "https://github.com/celo-org/bls12377js#cada1105f4a5e4c2ddd239c1874df3bf33144a10", "chai-subset": "^1.6.0", "csv-parser": "^2.0.0", "csv-stringify": "^4.3.1", diff --git a/packages/protocol/test/common/accounts.ts b/packages/protocol/test/common/accounts.ts index 6e409ed4543..86c65839056 100644 --- a/packages/protocol/test/common/accounts.ts +++ b/packages/protocol/test/common/accounts.ts @@ -1,14 +1,23 @@ import { parseSolidityStringArray } from '@celo/utils/lib/parsing' import { upperFirst } from 'lodash' -import { AccountsInstance } from 'types' -import { getParsedSignatureOfAddress } from '../../lib/signing-utils' +import { CeloContractName } from '@celo/protocol/lib/registry-utils' +import { getParsedSignatureOfAddress } from '@celo/protocol/lib/signing-utils' import { assertLogMatches, assertLogMatches2, assertRevert, NULL_ADDRESS, -} from '../../lib/test-utils' -const Accounts: Truffle.Contract = artifacts.require('Accounts') +} from '@celo/protocol/lib/test-utils' +import { + AccountsContract, + AccountsInstance, + MockValidatorsContract, + MockValidatorsInstance, + RegistryContract, +} from 'types' +const Accounts: AccountsContract = artifacts.require('Accounts') +const Registry: RegistryContract = artifacts.require('Registry') +const MockValidators: MockValidatorsContract = artifacts.require('MockValidators') const authorizationTests: any = {} const authorizationTestDescriptions = { voting: { @@ -16,8 +25,8 @@ const authorizationTestDescriptions = { subject: 'voteSigner', }, validating: { - me: 'validation signing key', - subject: 'validationSigner', + me: 'validator signing key', + subject: 'validatorSigner', }, attesting: { me: 'attestation signing key', @@ -27,6 +36,7 @@ const authorizationTestDescriptions = { contract('Accounts', (accounts: string[]) => { let accountsInstance: AccountsInstance + let mockValidators: MockValidatorsInstance const account = accounts[0] const caller = accounts[0] @@ -39,27 +49,28 @@ contract('Accounts', (accounts: string[]) => { beforeEach(async () => { accountsInstance = await Accounts.new({ from: account }) + mockValidators = await MockValidators.new() + const registry = await Registry.new() + await registry.setAddressFor(CeloContractName.Validators, mockValidators.address) + await accountsInstance.initialize(registry.address) authorizationTests.voting = { fn: accountsInstance.authorizeVoteSigner, eventName: 'VoteSignerAuthorized', getAuthorizedFromAccount: accountsInstance.getVoteSigner, - getAccountFromAuthorized: accountsInstance.voteSignerToAccount, - getAccountFromActiveAuthorized: accountsInstance.activeVoteSignerToAccount, + authorizedSignerToAccount: accountsInstance.voteSignerToAccount, } authorizationTests.validating = { - fn: accountsInstance.authorizeValidationSigner, - eventName: 'ValidationSignerAuthorized', - getAuthorizedFromAccount: accountsInstance.getValidationSigner, - getAccountFromAuthorized: accountsInstance.validationSignerToAccount, - getAccountFromActiveAuthorized: accountsInstance.activeValidationSignerToAccount, + fn: accountsInstance.authorizeValidatorSigner, + eventName: 'ValidatorSignerAuthorized', + getAuthorizedFromAccount: accountsInstance.getValidatorSigner, + authorizedSignerToAccount: accountsInstance.validatorSignerToAccount, } authorizationTests.attesting = { fn: accountsInstance.authorizeAttestationSigner, eventName: 'AttestationSignerAuthorized', getAuthorizedFromAccount: accountsInstance.getAttestationSigner, - getAccountFromAuthorized: accountsInstance.attestationSignerToAccount, - getAccountFromActiveAuthorized: accountsInstance.activeAttesttationSignerToAccount, + authorizedSignerToAccount: accountsInstance.attestationSignerToAccount, } }) @@ -359,7 +370,7 @@ contract('Accounts', (accounts: string[]) => { await authorizationTest.fn(authorized, sig.v, sig.r, sig.s) assert.equal(await accountsInstance.authorizedBy(authorized), account) assert.equal(await authorizationTest.getAuthorizedFromAccount(account), authorized) - assert.equal(await authorizationTest.getAccountFromActiveAuthorized(authorized), account) + assert.equal(await authorizationTest.authorizedSignerToAccount(authorized), account) }) it(`should emit the right event`, async () => { @@ -409,14 +420,11 @@ contract('Accounts', (accounts: string[]) => { it(`should set the new authorized ${authorizationTestDescriptions[key].me}`, async () => { assert.equal(await accountsInstance.authorizedBy(newAuthorized), account) assert.equal(await authorizationTest.getAuthorizedFromAccount(account), newAuthorized) - assert.equal( - await authorizationTest.getAccountFromActiveAuthorized(newAuthorized), - account - ) + assert.equal(await authorizationTest.authorizedSignerToAccount(newAuthorized), account) }) - it('should reset the previous authorization', async () => { - assert.equal(await accountsInstance.authorizedBy(authorized), NULL_ADDRESS) + it('should preserve the previous authorization', async () => { + assert.equal(await accountsInstance.authorizedBy(authorized), account) }) }) }) @@ -426,11 +434,11 @@ contract('Accounts', (accounts: string[]) => { authorizationTestDescriptions[key].me }`, () => { it('should return the account when passed the account', async () => { - assert.equal(await authorizationTest.getAccountFromActiveAuthorized(account), account) + assert.equal(await authorizationTest.authorizedSignerToAccount(account), account) }) it('should revert when passed an address that is not an account', async () => { - await assertRevert(authorizationTest.getAccountFromActiveAuthorized(accounts[1])) + await assertRevert(authorizationTest.authorizedSignerToAccount(accounts[1])) }) }) @@ -444,16 +452,13 @@ contract('Accounts', (accounts: string[]) => { }) it('should return the account when passed the account', async () => { - assert.equal(await authorizationTest.getAccountFromActiveAuthorized(account), account) + assert.equal(await authorizationTest.authorizedSignerToAccount(account), account) }) it(`should return the account when passed the ${ authorizationTestDescriptions[key].me }`, async () => { - assert.equal( - await authorizationTest.getAccountFromActiveAuthorized(authorized), - account - ) + assert.equal(await authorizationTest.authorizedSignerToAccount(authorized), account) }) }) }) diff --git a/packages/protocol/test/governance/election.ts b/packages/protocol/test/governance/election.ts index b4469376c56..c0b98704a9b 100644 --- a/packages/protocol/test/governance/election.ts +++ b/packages/protocol/test/governance/election.ts @@ -751,7 +751,7 @@ contract('Election', (accounts: string[]) => { }) }) - describe('#electValidators', () => { + describe('#electValidatorSigners', () => { let random: MockRandomInstance let totalLockedGold: number const group1 = accounts[0] @@ -812,7 +812,7 @@ contract('Election', (accounts: string[]) => { it("should return that group's member list", async () => { await setRandomness(hash1) - assertSameAddresses(await election.electValidators(), [ + assertSameAddresses(await election.electValidatorSigners(), [ validator1, validator2, validator3, @@ -830,7 +830,7 @@ contract('Election', (accounts: string[]) => { it('should return maxElectableValidators elected validators', async () => { await setRandomness(hash1) - assertSameAddresses(await election.electValidators(), [ + assertSameAddresses(await election.electValidatorSigners(), [ validator1, validator2, validator3, @@ -850,9 +850,9 @@ contract('Election', (accounts: string[]) => { it('should return different results', async () => { await setRandomness(hash1) - const valsWithHash1 = (await election.electValidators()).map((x) => x.toLowerCase()) + const valsWithHash1 = (await election.electValidatorSigners()).map((x) => x.toLowerCase()) await setRandomness(hash2) - const valsWithHash2 = (await election.electValidators()).map((x) => x.toLowerCase()) + const valsWithHash2 = (await election.electValidatorSigners()).map((x) => x.toLowerCase()) assert.sameMembers(valsWithHash1, valsWithHash2) assert.notDeepEqual(valsWithHash1, valsWithHash2) }) @@ -872,7 +872,7 @@ contract('Election', (accounts: string[]) => { it('should elect only n members from that group', async () => { await setRandomness(hash1) - assertSameAddresses(await election.electValidators(), [ + assertSameAddresses(await election.electValidatorSigners(), [ validator7, validator1, validator2, @@ -894,7 +894,7 @@ contract('Election', (accounts: string[]) => { it('should not elect any members from that group', async () => { await setRandomness(hash1) - assertSameAddresses(await election.electValidators(), [ + assertSameAddresses(await election.electValidatorSigners(), [ validator1, validator2, validator3, @@ -913,7 +913,7 @@ contract('Election', (accounts: string[]) => { it('should revert', async () => { await setRandomness(hash1) - await assertRevert(election.electValidators()) + await assertRevert(election.electValidatorSigners()) }) }) }) diff --git a/packages/protocol/test/governance/validators.ts b/packages/protocol/test/governance/validators.ts index 749a8581df3..387b5fdbd62 100644 --- a/packages/protocol/test/governance/validators.ts +++ b/packages/protocol/test/governance/validators.ts @@ -1,4 +1,5 @@ import { CeloContractName } from '@celo/protocol/lib/registry-utils' +import { getParsedSignatureOfAddress } from '@celo/protocol/lib/signing-utils' import { assertContainSubset, assertEqualBN, @@ -10,6 +11,7 @@ import { timeTravel, } from '@celo/protocol/lib/test-utils' import { fixed1, fromFixed, toFixed } from '@celo/utils/lib/fixidity' +import { addressToPublicKey } from '@celo/utils/lib/signatureUtils' import BigNumber from 'bignumber.js' import { AccountsContract, @@ -25,8 +27,8 @@ import { ValidatorsTestContract, ValidatorsTestInstance, } from 'types' -const Accounts: AccountsContract = artifacts.require('Accounts') +const Accounts: AccountsContract = artifacts.require('Accounts') const Validators: ValidatorsTestContract = artifacts.require('ValidatorsTest') const MockElection: MockElectionContract = artifacts.require('MockElection') const MockLockedGold: MockLockedGoldContract = artifacts.require('MockLockedGold') @@ -39,9 +41,10 @@ Validators.numberFormat = 'BigNumber' const parseValidatorParams = (validatorParams: any) => { return { - publicKeysData: validatorParams[0], - affiliation: validatorParams[1], - score: validatorParams[2], + ecdsaPublicKey: validatorParams[0], + blsPublicKey: validatorParams[1], + affiliation: validatorParams[2], + score: validatorParams[3], } } @@ -90,24 +93,26 @@ contract('Validators', (accounts: string[]) => { const maxGroupSize = new BigNumber(5) // A random 64 byte hex string. - const publicKey = - 'ea0733ad275e2b9e05541341a97ee82678c58932464fad26164657a111a7e37a9fa0300266fb90e2135a1f1512350cb4e985488a88809b14e3cbe415e76e82b2' const blsPublicKey = - '4d23d8cd06f30b1fa7cf368e2f5399ab04bb6846c682f493a98a607d3dfb7e53a712bb79b475c57b0ac2785460f91301' + '0x4d23d8cd06f30b1fa7cf368e2f5399ab04bb6846c682f493a98a607d3dfb7e53a712bb79b475c57b0ac2785460f91301' const blsPoP = - '9d3e1d8f49f6b0d8e9a03d80ca07b1d24cf1cc0557bdcc04f5e17a46e35d02d0d411d956dbd5d2d2464eebd7b74ae30005d223780d785d2abc5644fac7ac29fb0e302bdc80c81a5d45018b68b1045068a4b3a4861c93037685fd0d252d740501' - const publicKeysData = '0x' + publicKey + blsPublicKey + blsPoP + '0x9d3e1d8f49f6b0d8e9a03d80ca07b1d24cf1cc0557bdcc04f5e17a46e35d02d0d411d956dbd5d2d2464eebd7b74ae30005d223780d785d2abc5644fac7ac29fb0e302bdc80c81a5d45018b68b1045068a4b3a4861c93037685fd0d252d740501' const commission = toFixed(1 / 100) beforeEach(async () => { accountsInstance = await Accounts.new() - await Promise.all(accounts.map((account) => accountsInstance.createAccount({ from: account }))) + // Do not register an account for the last address so it can be used as an authorized validator signer. + await Promise.all( + accounts.slice(0, -1).map((account) => accountsInstance.createAccount({ from: account })) + ) mockElection = await MockElection.new() mockLockedGold = await MockLockedGold.new() registry = await Registry.new() validators = await Validators.new() + await accountsInstance.initialize(registry.address) await registry.setAddressFor(CeloContractName.Accounts, accountsInstance.address) await registry.setAddressFor(CeloContractName.Election, mockElection.address) await registry.setAddressFor(CeloContractName.LockedGold, mockLockedGold.address) + await registry.setAddressFor(CeloContractName.Validators, validators.address) await validators.initialize( registry.address, groupLockedGoldRequirements.value, @@ -123,9 +128,14 @@ contract('Validators', (accounts: string[]) => { const registerValidator = async (validator: string) => { await mockLockedGold.setAccountTotalLockedGold(validator, validatorLockedGoldRequirements.value) + const publicKey = await addressToPublicKey(validator, web3.eth.sign) await validators.registerValidator( // @ts-ignore bytes type - publicKeysData, + publicKey, + // @ts-ignore bytes type + blsPublicKey, + // @ts-ignore bytes type + blsPoP, { from: validator } ) } @@ -519,78 +529,110 @@ contract('Validators', (accounts: string[]) => { const validator = accounts[0] let resp: any describe('when the account is not a registered validator', () => { - let validatorRegistrationEpochNumber: number beforeEach(async () => { await mockLockedGold.setAccountTotalLockedGold( validator, validatorLockedGoldRequirements.value ) - resp = await validators.registerValidator( - // @ts-ignore bytes type - publicKeysData - ) - const blockNumber = (await web3.eth.getBlock('latest')).number - validatorRegistrationEpochNumber = Math.floor(blockNumber / EPOCH) }) - it('should mark the account as a validator', async () => { - assert.isTrue(await validators.isValidator(validator)) - }) + describe('when the account has authorized a validator signer', () => { + let validatorRegistrationEpochNumber: number + let publicKey: string + beforeEach(async () => { + const signer = accounts[9] + const sig = await getParsedSignatureOfAddress(web3, validator, signer) + await accountsInstance.authorizeValidatorSigner(signer, sig.v, sig.r, sig.s) + publicKey = await addressToPublicKey(signer, web3.eth.sign) + resp = await validators.registerValidator( + // @ts-ignore bytes type + publicKey, + // @ts-ignore bytes type + blsPublicKey, + // @ts-ignore bytes type + blsPoP + ) + const blockNumber = await web3.eth.getBlockNumber() + validatorRegistrationEpochNumber = Math.floor(blockNumber / EPOCH) + }) - it('should add the account to the list of validators', async () => { - assert.deepEqual(await validators.getRegisteredValidators(), [validator]) - }) + it('should mark the account as a validator', async () => { + assert.isTrue(await validators.isValidator(validator)) + }) - it('should set the validator public key', async () => { - const parsedValidator = parseValidatorParams(await validators.getValidator(validator)) - assert.equal(parsedValidator.publicKeysData, publicKeysData) - }) + it('should add the account to the list of validators', async () => { + assert.deepEqual(await validators.getRegisteredValidators(), [validator]) + }) - it('should set account locked gold requirements', async () => { - const requirement = await validators.getAccountLockedGoldRequirement(validator) - assertEqualBN(requirement, validatorLockedGoldRequirements.value) - }) + it('should set the validator ecdsa public key', async () => { + const parsedValidator = parseValidatorParams(await validators.getValidator(validator)) + assert.equal(parsedValidator.ecdsaPublicKey, publicKey) + }) - it('should set the validator membership history', async () => { - const membershipHistory = await validators.getMembershipHistory(validator) - assertEqualBNArray(membershipHistory[0], [validatorRegistrationEpochNumber]) - assert.deepEqual(membershipHistory[1], [NULL_ADDRESS]) - }) + it('should set the validator bls public key', async () => { + const parsedValidator = parseValidatorParams(await validators.getValidator(validator)) + assert.equal(parsedValidator.blsPublicKey, blsPublicKey) + }) - it('should set the validator membership history', async () => { - const membershipHistory = await validators.getMembershipHistory(validator) - assertEqualBNArray(membershipHistory[0], [validatorRegistrationEpochNumber]) - assert.deepEqual(membershipHistory[1], [NULL_ADDRESS]) - }) + it('should set account locked gold requirements', async () => { + const requirement = await validators.getAccountLockedGoldRequirement(validator) + assertEqualBN(requirement, validatorLockedGoldRequirements.value) + }) - it('should emit the ValidatorRegistered event', async () => { - assert.equal(resp.logs.length, 1) - const log = resp.logs[0] - assertContainSubset(log, { - event: 'ValidatorRegistered', - args: { - validator, - publicKeysData, - }, + it('should set the validator membership history', async () => { + const membershipHistory = await validators.getMembershipHistory(validator) + assertEqualBNArray(membershipHistory[0], [validatorRegistrationEpochNumber]) + assert.deepEqual(membershipHistory[1], [NULL_ADDRESS]) + }) + + it('should set the validator membership history', async () => { + const membershipHistory = await validators.getMembershipHistory(validator) + assertEqualBNArray(membershipHistory[0], [validatorRegistrationEpochNumber]) + assert.deepEqual(membershipHistory[1], [NULL_ADDRESS]) + }) + + it('should emit the ValidatorRegistered event', async () => { + assert.equal(resp.logs.length, 1) + const log = resp.logs[0] + assertContainSubset(log, { + event: 'ValidatorRegistered', + args: { + validator, + ecdsaPublicKey: publicKey, + blsPublicKey: blsPublicKey, + }, + }) }) }) }) describe('when the account is already a registered validator ', () => { + let publicKey: string beforeEach(async () => { await mockLockedGold.setAccountTotalLockedGold( validator, validatorLockedGoldRequirements.value ) - // @ts-ignore bytes type - await validators.registerValidator(publicKeysData) }) it('should revert', async () => { + publicKey = await addressToPublicKey(validator, web3.eth.sign) + await validators.registerValidator( + // @ts-ignore bytes type + publicKey, + // @ts-ignore bytes type + blsPublicKey, + // @ts-ignore bytes type + blsPoP + ) await assertRevert( validators.registerValidator( // @ts-ignore bytes type - publicKeysData + publicKey, + // @ts-ignore bytes type + blsPublicKey, + // @ts-ignore bytes type + blsPoP ) ) }) @@ -603,10 +645,15 @@ contract('Validators', (accounts: string[]) => { }) it('should revert', async () => { + const publicKey = await addressToPublicKey(validator, web3.eth.sign) await assertRevert( validators.registerValidator( // @ts-ignore bytes type - publicKeysData + publicKey, + // @ts-ignore bytes type + blsPublicKey, + // @ts-ignore bytes type + blsPoP ) ) }) @@ -621,10 +668,15 @@ contract('Validators', (accounts: string[]) => { }) it('should revert', async () => { + const publicKey = await addressToPublicKey(validator, web3.eth.sign) await assertRevert( validators.registerValidator( // @ts-ignore bytes type - publicKeysData + publicKey, + // @ts-ignore bytes type + blsPublicKey, + // @ts-ignore bytes type + blsPoP ) ) }) @@ -750,7 +802,7 @@ contract('Validators', (accounts: string[]) => { describe('when the account has a registered validator', () => { beforeEach(async () => { await registerValidator(validator) - registrationEpoch = Math.floor((await web3.eth.getBlock('latest')).number / EPOCH) + registrationEpoch = Math.floor((await web3.eth.getBlockNumber()) / EPOCH) }) describe('when affiliating with a registered validator group', () => { beforeEach(async () => { @@ -831,9 +883,9 @@ contract('Validators', (accounts: string[]) => { await validators.addFirstMember(validator, NULL_ADDRESS, NULL_ADDRESS, { from: group, }) - additionEpoch = Math.floor((await web3.eth.getBlock('latest')).number / EPOCH) + additionEpoch = Math.floor((await web3.eth.getBlockNumber()) / EPOCH) resp = await validators.affiliate(otherGroup) - affiliationEpoch = Math.floor((await web3.eth.getBlock('latest')).number / EPOCH) + affiliationEpoch = Math.floor((await web3.eth.getBlockNumber()) / EPOCH) }) it('should remove the validator from the group membership list', async () => { @@ -931,7 +983,7 @@ contract('Validators', (accounts: string[]) => { let registrationEpoch: number beforeEach(async () => { await registerValidator(validator) - registrationEpoch = Math.floor((await web3.eth.getBlock('latest')).number / EPOCH) + registrationEpoch = Math.floor((await web3.eth.getBlockNumber()) / EPOCH) await registerValidatorGroup(group) await validators.affiliate(group) }) @@ -961,9 +1013,9 @@ contract('Validators', (accounts: string[]) => { let resp: any beforeEach(async () => { await validators.addFirstMember(validator, NULL_ADDRESS, NULL_ADDRESS, { from: group }) - additionEpoch = Math.floor((await web3.eth.getBlock('latest')).number / EPOCH) + additionEpoch = Math.floor((await web3.eth.getBlockNumber()) / EPOCH) resp = await validators.deaffiliate() - deaffiliationEpoch = Math.floor((await web3.eth.getBlock('latest')).number / EPOCH) + deaffiliationEpoch = Math.floor((await web3.eth.getBlockNumber()) / EPOCH) }) it('should remove the validator from the group membership list', async () => { @@ -1016,53 +1068,116 @@ contract('Validators', (accounts: string[]) => { }) }) - describe('#updatePublicKeysData()', () => { - const newPublicKey = web3.utils.randomHex(64).slice(2) - const newBlsPublicKey = web3.utils.randomHex(48).slice(2) - const newBlsPoP = web3.utils.randomHex(96).slice(2) - const newPublicKeysData = '0x' + newPublicKey + newBlsPublicKey + newBlsPoP + describe('#updateEcdsaPublicKey()', () => { + describe('when called by a registered validator', () => { + const validator = accounts[0] + beforeEach(async () => { + await registerValidator(validator) + }) + + describe('when called by the registered `Accounts` contract', () => { + beforeEach(async () => { + await registry.setAddressFor(CeloContractName.Accounts, accounts[0]) + }) + + describe('when the public key matches the signer', () => { + let resp: any + let newPublicKey: string + const signer = accounts[9] + beforeEach(async () => { + newPublicKey = await addressToPublicKey(signer, web3.eth.sign) + // @ts-ignore Broken typechain typing for bytes + resp = await validators.updateEcdsaPublicKey(validator, signer, newPublicKey) + }) + + it('should set the validator ecdsa public key', async () => { + const parsedValidator = parseValidatorParams(await validators.getValidator(validator)) + assert.equal(parsedValidator.ecdsaPublicKey, newPublicKey) + }) + + it('should emit the ValidatorEcdsaPublicKeyUpdated event', async () => { + assert.equal(resp.logs.length, 1) + const log = resp.logs[0] + assertContainSubset(log, { + event: 'ValidatorEcdsaPublicKeyUpdated', + args: { + validator, + ecdsaPublicKey: newPublicKey, + }, + }) + }) + }) + + describe('when the public key does not match the signer', () => { + let newPublicKey: string + const signer = accounts[9] + it('should revert', async () => { + newPublicKey = await addressToPublicKey(accounts[8], web3.eth.sign) + // @ts-ignore Broken typechain typing for bytes + await assertRevert(validators.updateEcdsaPublicKey(validator, signer, newPublicKey)) + }) + }) + }) + + describe('when not called by the registered `Accounts` contract', () => { + describe('when the public key matches the signer', () => { + let newPublicKey: string + const signer = accounts[9] + it('should revert', async () => { + newPublicKey = await addressToPublicKey(signer, web3.eth.sign) + // @ts-ignore Broken typechain typing for bytes + await assertRevert(validators.updateEcdsaPublicKey(validator, signer, newPublicKey)) + }) + }) + }) + }) + }) + + describe('#updateBlsPublicKey()', () => { + const newBlsPublicKey = web3.utils.randomHex(48) + const newBlsPoP = web3.utils.randomHex(96) describe('when called by a registered validator', () => { const validator = accounts[0] beforeEach(async () => { await registerValidator(validator) }) - describe('when the public keys data is the right length', () => { + describe('when the keys are the right length', () => { let resp: any beforeEach(async () => { // @ts-ignore Broken typechain typing for bytes - resp = await validators.updatePublicKeysData(newPublicKeysData) + resp = await validators.updateBlsPublicKey(newBlsPublicKey, newBlsPoP) }) - it('should set the validator public keys data', async () => { + it('should set the validator bls public key', async () => { const parsedValidator = parseValidatorParams(await validators.getValidator(validator)) - assert.equal(parsedValidator.publicKeysData, newPublicKeysData) + assert.equal(parsedValidator.blsPublicKey, newBlsPublicKey) }) - it('should emit the ValidatorPublicKeysDataUpdated event', async () => { + it('should emit the ValidatorBlsPublicKeyUpdated event', async () => { assert.equal(resp.logs.length, 1) const log = resp.logs[0] assertContainSubset(log, { - event: 'ValidatorPublicKeysDataUpdated', + event: 'ValidatorBlsPublicKeyUpdated', args: { validator, - publicKeysData: newPublicKeysData, + blsPublicKey: newBlsPublicKey, }, }) }) }) - describe('when the public keys data is too long', () => { + describe('when the public key is not 48 bytes', () => { it('should revert', async () => { // @ts-ignore Broken typechain typing for bytes - await assertRevert(validators.updatePublicKeysData(newPublicKeysData + '00')) + await assertRevert(validators.updateBlsPublicKey(newBlsPublicKey + '01', newBlsPoP)) }) }) - describe('when the public keys data is too short', () => { + describe('when the proof of possession is not 96 bytes', () => { it('should revert', async () => { // @ts-ignore Broken typechain typing for bytes - await assertRevert(validators.updatePublicKeysData(newPublicKeysData.slice(0, -2))) + await assertRevert(validators.updateBlsPublicKey(newBlsPublicKey, newBlsPoP + '01')) }) }) }) @@ -1276,15 +1391,19 @@ contract('Validators', (accounts: string[]) => { await registerValidatorGroup(group) }) describe('when adding a validator affiliated with the group', () => { + let registrationEpoch: number beforeEach(async () => { await registerValidator(validator) + registrationEpoch = Math.floor((await web3.eth.getBlockNumber()) / EPOCH) await validators.affiliate(group, { from: validator }) }) describe('when the group meets the locked gold requirements', () => { describe('when the validator meets the locked gold requirements', () => { + let additionEpoch: number beforeEach(async () => { resp = await validators.addFirstMember(validator, NULL_ADDRESS, NULL_ADDRESS) + additionEpoch = Math.floor((await web3.eth.getBlockNumber()) / EPOCH) }) it('should add the member to the list of members', async () => { @@ -1306,14 +1425,14 @@ contract('Validators', (accounts: string[]) => { }) it("should update the member's membership history", async () => { - const membershipHistory = await validators.getMembershipHistory(validator) - const expectedEpoch = new BigNumber( - Math.floor((await web3.eth.getBlock('latest')).number / EPOCH) + const expectedEntries = registrationEpoch == additionEpoch ? 1 : 2 + const membershipHistory = parseMembershipHistory( + await validators.getMembershipHistory(validator) ) - assert.equal(membershipHistory[0].length, 1) - assertEqualBN(membershipHistory[0][0], expectedEpoch) - assert.equal(membershipHistory[1].length, 1) - assertSameAddress(membershipHistory[1][0], group) + assert.equal(membershipHistory.epochs.length, expectedEntries) + assertEqualBN(membershipHistory.epochs[expectedEntries - 1], additionEpoch) + assert.equal(membershipHistory.groups.length, expectedEntries) + assertSameAddress(membershipHistory.groups[expectedEntries - 1], group) }) it('should mark the group as eligible', async () => { @@ -1602,7 +1721,7 @@ contract('Validators', (accounts: string[]) => { }) }) - describe('#updateValidatorScore', () => { + describe('#updateValidatorScoreFromSigner', () => { const validator = accounts[0] beforeEach(async () => { await registerValidator(validator) @@ -1614,7 +1733,7 @@ contract('Validators', (accounts: string[]) => { const epochScore = uptime.pow(validatorScoreParameters.exponent) const adjustmentSpeed = fromFixed(validatorScoreParameters.adjustmentSpeed) beforeEach(async () => { - await validators.updateValidatorScore(validator, toFixed(uptime)) + await validators.updateValidatorScoreFromSigner(validator, toFixed(uptime)) }) it('should update the validator score', async () => { @@ -1625,7 +1744,7 @@ contract('Validators', (accounts: string[]) => { describe('when the validator already has a non-zero score', () => { beforeEach(async () => { - await validators.updateValidatorScore(validator, toFixed(uptime)) + await validators.updateValidatorScoreFromSigner(validator, toFixed(uptime)) }) it('should update the validator score', async () => { @@ -1643,18 +1762,18 @@ contract('Validators', (accounts: string[]) => { describe('when uptime > 1.0', () => { const uptime = 1.01 it('should revert', async () => { - await assertRevert(validators.updateValidatorScore(validator, toFixed(uptime))) + await assertRevert(validators.updateValidatorScoreFromSigner(validator, toFixed(uptime))) }) }) }) describe('#updateMembershipHistory', () => { const validator = accounts[0] - const groups = accounts.slice(1) + const groups = accounts.slice(1, -1) let validatorRegistrationEpochNumber: number beforeEach(async () => { await registerValidator(validator) - const blockNumber = (await web3.eth.getBlock('latest')).number + const blockNumber = await web3.eth.getBlockNumber() validatorRegistrationEpochNumber = Math.floor(blockNumber / EPOCH) for (const group of groups) { await registerValidatorGroup(group) @@ -1668,7 +1787,7 @@ contract('Validators', (accounts: string[]) => { const expectedMembershipHistoryGroups = [NULL_ADDRESS] const expectedMembershipHistoryEpochs = [new BigNumber(validatorRegistrationEpochNumber)] for (let i = 0; i < numTests; i++) { - const blockNumber = (await web3.eth.getBlock('latest')).number + const blockNumber = await web3.eth.getBlockNumber() const epochNumber = Math.floor(blockNumber / EPOCH) const blocksUntilNextEpoch = (epochNumber + 1) * EPOCH - blockNumber await mineBlocks(blocksUntilNextEpoch, web3) @@ -1707,7 +1826,7 @@ contract('Validators', (accounts: string[]) => { const expectedMembershipHistoryGroups = [NULL_ADDRESS] const expectedMembershipHistoryEpochs = [new BigNumber(validatorRegistrationEpochNumber)] for (let i = 0; i < membershipHistoryLength.plus(1).toNumber(); i++) { - const blockNumber = (await web3.eth.getBlock('latest')).number + const blockNumber = await web3.eth.getBlockNumber() const epochNumber = Math.floor(blockNumber / EPOCH) const blocksUntilNextEpoch = (epochNumber + 1) * EPOCH - blockNumber await mineBlocks(blocksUntilNextEpoch, web3) @@ -1732,7 +1851,7 @@ contract('Validators', (accounts: string[]) => { describe('#getMembershipInLastEpoch', () => { const validator = accounts[0] - const groups = accounts.slice(1) + const groups = accounts.slice(1, -1) beforeEach(async () => { await registerValidator(validator) for (const group of groups) { @@ -1743,7 +1862,7 @@ contract('Validators', (accounts: string[]) => { describe('when changing groups more times than membership history length', () => { it('should always return the correct membership for the last epoch', async () => { for (let i = 0; i < membershipHistoryLength.plus(1).toNumber(); i++) { - const blockNumber = (await web3.eth.getBlock('latest')).number + const blockNumber = await web3.eth.getBlockNumber() const epochNumber = Math.floor(blockNumber / EPOCH) const blocksUntilNextEpoch = (epochNumber + 1) * EPOCH - blockNumber await mineBlocks(blocksUntilNextEpoch, web3) @@ -1835,7 +1954,7 @@ contract('Validators', (accounts: string[]) => { }) }) - describe('#distributeEpochPayment', () => { + describe('#distributeEpochPaymentsFromSigner', () => { const validator = accounts[0] const group = accounts[1] const maxPayment = new BigNumber(20122394876) @@ -1844,6 +1963,10 @@ contract('Validators', (accounts: string[]) => { await registerValidatorGroupWithMembers(group, [validator]) mockStableToken = await MockStableToken.new() await registry.setAddressFor(CeloContractName.StableToken, mockStableToken.address) + // Fast-forward to the next epoch, so that the getMembershipInLastEpoch(validator) == group + const blockNumber = await web3.eth.getBlockNumber() + const epochNumber = Math.floor(blockNumber / EPOCH) + await mineBlocks((epochNumber + 1) * EPOCH - blockNumber, web3) }) describe('when the validator score is non-zero', () => { @@ -1857,14 +1980,15 @@ contract('Validators', (accounts: string[]) => { .times(fromFixed(commission)) .dp(0, BigNumber.ROUND_FLOOR) const expectedValidatorPayment = expectedTotalPayment.minus(expectedGroupPayment) + beforeEach(async () => { - await validators.updateValidatorScore(validator, toFixed(uptime)) + await validators.updateValidatorScoreFromSigner(validator, toFixed(uptime)) }) describe('when the validator and group meet the balance requirements', () => { beforeEach(async () => { - ret = await validators.distributeEpochPayment.call(validator, maxPayment) - await validators.distributeEpochPayment(validator, maxPayment) + ret = await validators.distributeEpochPaymentsFromSigner.call(validator, maxPayment) + await validators.distributeEpochPaymentsFromSigner(validator, maxPayment) }) it('should pay the validator', async () => { @@ -1886,8 +2010,8 @@ contract('Validators', (accounts: string[]) => { validator, validatorLockedGoldRequirements.value.minus(1) ) - ret = await validators.distributeEpochPayment.call(validator, maxPayment) - await validators.distributeEpochPayment(validator, maxPayment) + ret = await validators.distributeEpochPaymentsFromSigner.call(validator, maxPayment) + await validators.distributeEpochPaymentsFromSigner(validator, maxPayment) }) it('should not pay the validator', async () => { @@ -1909,8 +2033,8 @@ contract('Validators', (accounts: string[]) => { group, groupLockedGoldRequirements.value.minus(1) ) - ret = await validators.distributeEpochPayment.call(validator, maxPayment) - await validators.distributeEpochPayment(validator, maxPayment) + ret = await validators.distributeEpochPaymentsFromSigner.call(validator, maxPayment) + await validators.distributeEpochPaymentsFromSigner(validator, maxPayment) }) it('should not pay the validator', async () => { diff --git a/packages/protocol/test/identity/attestations.ts b/packages/protocol/test/identity/attestations.ts index ebed62fd29a..4add2b99b64 100644 --- a/packages/protocol/test/identity/attestations.ts +++ b/packages/protocol/test/identity/attestations.ts @@ -2,11 +2,11 @@ import Web3 = require('web3') import { CeloContractName } from '@celo/protocol/lib/registry-utils' import { - advanceBlockNum, assertEqualBN, assertLogMatches2, assertRevert, assertSameAddress, + mineBlocks, NULL_ADDRESS, } from '@celo/protocol/lib/test-utils' import { attestToIdentifier } from '@celo/utils' @@ -26,6 +26,7 @@ import { MockRandomInstance, MockStableTokenContract, MockStableTokenInstance, + MockValidatorsContract, RegistryContract, RegistryInstance, TestAttestationsContract, @@ -43,6 +44,7 @@ const Attestations: TestAttestationsContract = artifacts.require('TestAttestatio const MockStableToken: MockStableTokenContract = artifacts.require('MockStableToken') const MockElection: MockElectionContract = artifacts.require('MockElection') const MockLockedGold: MockLockedGoldContract = artifacts.require('MockLockedGold') +const MockValidators: MockValidatorsContract = artifacts.require('MockValidators') const Random: MockRandomContract = artifacts.require('MockRandom') const Registry: RegistryContract = artifacts.require('Registry') @@ -131,17 +133,21 @@ contract('Attestations', (accounts: string[]) => { accountsInstance = await Accounts.new() mockStableToken = await MockStableToken.new() otherMockStableToken = await MockStableToken.new() + const mockValidators = await MockValidators.new() attestations = await Attestations.new() random = await Random.new() random.addTestRandomness(0, '0x00') mockLockedGold = await MockLockedGold.new() + registry = await Registry.new() + await accountsInstance.initialize(registry.address) + await registry.setAddressFor(CeloContractName.Validators, mockValidators.address) await Promise.all( accounts.map(async (account) => { await accountsInstance.createAccount({ from: account }) await unlockAndAuthorizeKey( KeyOffsets.VALIDATING_KEY_OFFSET, - accountsInstance.authorizeValidationSigner, + accountsInstance.authorizeValidatorSigner, account ) }) @@ -153,7 +159,6 @@ contract('Attestations', (accounts: string[]) => { privateKeyToAddress(getDerivedKey(KeyOffsets.VALIDATING_KEY_OFFSET, account)) ) ) - registry = await Registry.new() await registry.setAddressFor(CeloContractName.Accounts, accountsInstance.address) await registry.setAddressFor(CeloContractName.Random, random.address) await registry.setAddressFor(CeloContractName.Election, mockElection.address) @@ -348,7 +353,7 @@ contract('Attestations', (accounts: string[]) => { describe('when the original request has expired', () => { it('should allow to request more attestations', async () => { - await advanceBlockNum(attestationExpiryBlocks, web3) + await mineBlocks(attestationExpiryBlocks, web3) await attestations.request(phoneHash, 1, mockStableToken.address) }) }) @@ -480,7 +485,7 @@ contract('Attestations', (accounts: string[]) => { describe('after attestationExpiryBlocks', () => { beforeEach(async () => { await attestations.selectIssuers(phoneHash) - await advanceBlockNum(attestationExpiryBlocks, web3) + await mineBlocks(attestationExpiryBlocks, web3) }) it('should no longer list the attestations in getCompletableAttestations', async () => { @@ -551,7 +556,7 @@ contract('Attestations', (accounts: string[]) => { }) it('should set the time of the successful completion', async () => { - await advanceBlockNum(1, web3) + await mineBlocks(1, web3) await attestations.complete(phoneHash, v, r, s) const expectedBlock = await web3.eth.getBlock('latest') @@ -647,7 +652,7 @@ contract('Attestations', (accounts: string[]) => { }) it('does not let you verify beyond the window', async () => { - await advanceBlockNum(attestationExpiryBlocks, web3) + await mineBlocks(attestationExpiryBlocks, web3) await assertRevert(attestations.complete(phoneHash, v, r, s)) }) }) diff --git a/packages/utils/src/address.ts b/packages/utils/src/address.ts index dcaf9fd424b..92f846ebbf1 100644 --- a/packages/utils/src/address.ts +++ b/packages/utils/src/address.ts @@ -3,21 +3,47 @@ import { privateToAddress, privateToPublic, pubToAddress, toChecksumAddress } fr export type Address = string export function eqAddress(a: Address, b: Address) { - return a.replace('0x', '').toLowerCase() === b.replace('0x', '').toLowerCase() + return stripHexLeader(a).toLowerCase() === stripHexLeader(b).toLowerCase() } export const privateKeyToAddress = (privateKey: string) => { return toChecksumAddress( - '0x' + privateToAddress(Buffer.from(privateKey.slice(2), 'hex')).toString('hex') + ensureHexLeader( + privateToAddress(Buffer.from(stripHexLeader(privateKey), 'hex')).toString('hex') + ) + ) +} + +export const privateKeyToPublicKey = (privateKey: string) => { + return toChecksumAddress( + ensureHexLeader(privateToPublic(Buffer.from(stripHexLeader(privateKey), 'hex')).toString('hex')) ) } export const publicKeyToAddress = (publicKey: string) => { - return '0x' + pubToAddress(Buffer.from(publicKey.slice(2), 'hex')).toString('hex') + return toChecksumAddress( + ensureHexLeader(pubToAddress(Buffer.from(stripHexLeader(publicKey), 'hex')).toString('hex')) + ) } -export const privateKeyToPublicKey = (privateKey: string) => { - return '0x' + privateToPublic(Buffer.from(privateKey.slice(2), 'hex')).toString('hex') +/** + * Strips out the leading '0x' from a hex string. Does not fail on a string that does not + * contain a leading '0x' + * + * @param hexString Hex string that may have '0x' prepended to it. + * @returns hexString with no leading '0x'. + */ +export function stripHexLeader(hexString: string): string { + return hexString.indexOf('0x') === 0 ? hexString.slice(2) : hexString +} + +/** + * Returns a hex string with 0x prepended if it's not already starting with 0x + */ +export function ensureHexLeader(hexString: string): string { + return '0x' + stripHexLeader(hexString) } +export { isValidAddress } from 'ethereumjs-util' export { toChecksumAddress } from 'ethereumjs-util' +export { isValidChecksumAddress } from 'ethereumjs-util' diff --git a/packages/utils/src/bls.ts b/packages/utils/src/bls.ts index b6e3889ee36..287d69f6fe1 100644 --- a/packages/utils/src/bls.ts +++ b/packages/utils/src/bls.ts @@ -2,10 +2,14 @@ const keccak256 = require('keccak256') const BigInteger = require('bigi') const reverse = require('buffer-reverse') +import * as bls12377js from 'bls12377js' +import { isValidAddress } from './address' const n = BigInteger.fromHex('12ab655e9a2ca55660b44d1e5c37b00159aa76fed00000010a11800000000001', 16) const MODULUSMASK = 31 +export const BLS_PUBLIC_KEY_SIZE = 48 +export const BLS_POP_SIZE = 96 export const blsPrivateKeyToProcessedPrivateKey = (privateKeyHex: string) => { for (let i = 0; i < 256; i++) { @@ -35,3 +39,24 @@ export const blsPrivateKeyToProcessedPrivateKey = (privateKeyHex: string) => { throw new Error("couldn't derive BLS key from ECDSA key") } + +const getBlsPrivateKey = (privateKeyHex: string) => { + const blsPrivateKeyBytes = blsPrivateKeyToProcessedPrivateKey(privateKeyHex.slice(2)) + return blsPrivateKeyBytes +} + +export const getBlsPublicKey = (privateKeyHex: string) => { + const blsPrivateKeyBytes = getBlsPrivateKey(privateKeyHex) + return '0x' + bls12377js.BLS.privateToPublicBytes(blsPrivateKeyBytes).toString('hex') +} + +export const getBlsPoP = (address: string, privateKeyHex: string) => { + if (!isValidAddress(address)) { + throw new Error('Invalid checksum address for generating BLS proof-of-possession') + } + const blsPrivateKeyBytes = getBlsPrivateKey(privateKeyHex) + return ( + '0x' + + bls12377js.BLS.signPoP(blsPrivateKeyBytes, Buffer.from(address.slice(2), 'hex')).toString('hex') + ) +} diff --git a/packages/utils/src/io.ts b/packages/utils/src/io.ts index 2d01ee0573d..14708ff1ee8 100644 --- a/packages/utils/src/io.ts +++ b/packages/utils/src/io.ts @@ -1,8 +1,8 @@ import { isValidPublic, toChecksumAddress } from 'ethereumjs-util' import { either } from 'fp-ts/lib/Either' import * as t from 'io-ts' +import { isValidAddress } from './address' import { isE164NumberStrict } from './phoneNumbers' -import { isValidAddress } from './signatureUtils' // from http://urlregex.com/ export const URL_REGEX = new RegExp( diff --git a/packages/utils/src/signatureUtils.ts b/packages/utils/src/signatureUtils.ts index 177874535ed..e05f5427b7c 100644 --- a/packages/utils/src/signatureUtils.ts +++ b/packages/utils/src/signatureUtils.ts @@ -1,7 +1,9 @@ +import assert = require('assert') + const ethjsutil = require('ethereumjs-util') import * as Web3Utils from 'web3-utils' -import { privateKeyToAddress } from './address' +import { eqAddress, privateKeyToAddress } from './address' // If messages is a hex, the length of it should be the number of bytes function messageLength(message: string) { @@ -25,6 +27,30 @@ export interface Signer { sign: (message: string) => Promise } +export async function addressToPublicKey( + signer: string, + signFn: (message: string, signer: string) => Promise +) { + const msg = new Buffer('dummy_msg_data') + const data = '0x' + msg.toString('hex') + // Note: Eth.sign typing displays incorrect parameter order + const sig = await signFn(data, signer) + + const rawsig = ethjsutil.fromRpcSig(sig) + const prefixedMsg = hashMessageWithPrefix(data) + const pubKey = ethjsutil.ecrecover( + Buffer.from(prefixedMsg.slice(2), 'hex'), + rawsig.v, + rawsig.r, + rawsig.s + ) + + const computedAddr = ethjsutil.pubToAddress(pubKey).toString('hex') + assert(eqAddress(computedAddr, signer), 'computed address !== signer') + + return '0x' + pubKey.toString('hex') +} + // Uses a native function to sign (as signFn), most commonly `web.eth.sign` export function NativeSigner( signFn: (message: string, signer: string) => Promise, @@ -45,6 +71,16 @@ export function LocalSigner(privateKey: string): Signer { } } +export function signedMessageToPublicKey(message: string, v: number, r: string, s: string) { + const pubKeyBuf = ethjsutil.ecrecover( + Buffer.from(message.slice(2), 'hex'), + v, + Buffer.from(r.slice(2), 'hex'), + Buffer.from(s.slice(2), 'hex') + ) + return '0x' + pubKeyBuf.toString('hex') +} + export function signMessage(message: string, privateKey: string, address: string) { return signMessageWithoutPrefix(hashMessageWithPrefix(message), privateKey, address) } @@ -137,42 +173,6 @@ function isValidSignature(signer: string, message: string, v: number, r: string, } } -/** - * Strips out the leading '0x' from a hex string. Does not fail on a string that does not - * contain a leading '0x' - * - * @param hexString Hex string that may have '0x' prepended to it. - * @returns hexString with no leading '0x'. - */ -export function stripHexLeader(hexString: string): string { - return hexString.indexOf('0x') === 0 ? hexString.slice(2) : hexString -} - -/** - * Returns a hex string with 0x prepended if it's not already starting with 0x - */ -export function ensureHexLeader(hexString: string): string { - return '0x' + stripHexLeader(hexString) -} - -export function isValidAddress(address: string) { - return ( - typeof address === 'string' && - !ethjsutil.isZeroAddress(address) && - ethjsutil.isValidAddress(address) - ) -} - -export function areAddressesEqual(address1: string | null, address2: string | null) { - if (address1) { - address1 = stripHexLeader(address1.toLowerCase()) - } - if (address2) { - address2 = stripHexLeader(address2.toLowerCase()) - } - return address1 === address2 -} - export const SignatureUtils = { NativeSigner, LocalSigner, @@ -180,9 +180,5 @@ export const SignatureUtils = { signMessageWithoutPrefix, parseSignature, parseSignatureWithoutPrefix, - stripHexLeader, - ensureHexLeader, serializeSignature, - isValidAddress, - areAddressesEqual, } From 101b27fecc7ea0d2d30472fc28c504307b1e9522 Mon Sep 17 00:00:00 2001 From: Asa Oines Date: Fri, 15 Nov 2019 20:58:02 -0800 Subject: [PATCH 07/61] Point end-to-end tests back to master (#1747) --- .circleci/config.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 1a53a694298..2d9e0987e1d 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -525,7 +525,7 @@ jobs: command: | set -e cd packages/celotool - ./ci_test_transfers.sh checkout asaj/key-rotation-plus-enode + ./ci_test_transfers.sh checkout master end-to-end-geth-blockchain-parameters-test: <<: *e2e-defaults @@ -543,7 +543,7 @@ jobs: command: | set -e cd packages/celotool - ./ci_test_blockchain_parameters.sh checkout asaj/key-rotation-plus-enode + ./ci_test_blockchain_parameters.sh checkout master end-to-end-geth-governance-test: <<: *e2e-defaults @@ -563,7 +563,7 @@ jobs: command: | set -e cd packages/celotool - ./ci_test_governance.sh checkout asaj/key-rotation-plus-enode + ./ci_test_governance.sh checkout master end-to-end-geth-sync-test: <<: *e2e-defaults @@ -582,7 +582,7 @@ jobs: command: | set -e cd packages/celotool - ./ci_test_sync.sh checkout asaj/key-rotation-plus-enode + ./ci_test_sync.sh checkout master end-to-end-geth-validator-order-test: <<: *e2e-defaults @@ -600,7 +600,7 @@ jobs: command: | set -e cd packages/celotool - ./ci_test_validator_order.sh checkout asaj/key-rotation-plus-enode + ./ci_test_validator_order.sh checkout master web: working_directory: ~/app From 7829d6feae61820c51d43d105040da370f6e60f0 Mon Sep 17 00:00:00 2001 From: Tim Moreton Date: Fri, 15 Nov 2019 21:25:38 -0800 Subject: [PATCH 08/61] Fix circle config --- .circleci/config.yml | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index b3c299d22e8..b305ba4af9d 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -545,11 +545,7 @@ jobs: command: | set -e cd packages/celotool -<<<<<<< HEAD ./ci_test_blockchain_parameters.sh checkout ${CELO_BLOCKCHAIN_BRANCH_TO_TEST} -======= - ./ci_test_blockchain_parameters.sh checkout asaj/key-rotation-plus-enode ->>>>>>> master end-to-end-geth-governance-test: <<: *e2e-defaults @@ -569,11 +565,7 @@ jobs: command: | set -e cd packages/celotool -<<<<<<< HEAD ./ci_test_governance.sh checkout ${CELO_BLOCKCHAIN_BRANCH_TO_TEST} -======= - ./ci_test_governance.sh checkout asaj/key-rotation-plus-enode ->>>>>>> master end-to-end-geth-sync-test: <<: *e2e-defaults @@ -592,11 +584,7 @@ jobs: command: | set -e cd packages/celotool -<<<<<<< HEAD ./ci_test_sync.sh checkout ${CELO_BLOCKCHAIN_BRANCH_TO_TEST} -======= - ./ci_test_sync.sh checkout asaj/key-rotation-plus-enode ->>>>>>> master end-to-end-geth-validator-order-test: <<: *e2e-defaults @@ -614,11 +602,7 @@ jobs: command: | set -e cd packages/celotool -<<<<<<< HEAD ./ci_test_validator_order.sh checkout ${CELO_BLOCKCHAIN_BRANCH_TO_TEST} -======= - ./ci_test_validator_order.sh checkout asaj/key-rotation-plus-enode ->>>>>>> master web: working_directory: ~/app From 598e2cbfd65fb8d23a1688055e7a94c6f0cdd052 Mon Sep 17 00:00:00 2001 From: Asa Oines Date: Sat, 16 Nov 2019 18:59:05 -0800 Subject: [PATCH 09/61] Improve reliability of flaky end-to-end governance test (#1748) --- .../src/e2e-tests/governance_tests.ts | 204 ++++++++++-------- packages/celotool/src/e2e-tests/utils.ts | 6 +- .../protocol/migrations/08_stabletoken.ts | 1 - .../protocol/test/governance/epochrewards.ts | 22 +- packages/utils/package.json | 1 + 5 files changed, 128 insertions(+), 106 deletions(-) diff --git a/packages/celotool/src/e2e-tests/governance_tests.ts b/packages/celotool/src/e2e-tests/governance_tests.ts index 87af3bce44c..39aea87e9b4 100644 --- a/packages/celotool/src/e2e-tests/governance_tests.ts +++ b/packages/celotool/src/e2e-tests/governance_tests.ts @@ -16,6 +16,100 @@ import { sleep, } from './utils' +interface MemberSwapper { + swap(): Promise +} + +async function newMemberSwapper(kit: ContractKit, members: string[]): Promise { + let index = 0 + const group = (await kit.web3.eth.getAccounts())[0] + await Promise.all(members.slice(1).map((member) => removeMember(member))) + + async function removeMember(member: string) { + return (await kit.contracts.getValidators()) + .removeMember(member) + .sendAndWaitForReceipt({ from: group }) + } + + async function addMember(member: string) { + return (await (await kit.contracts.getValidators()).addMember( + group, + member + )).sendAndWaitForReceipt({ from: group }) + } + + async function getGroupMembers() { + const groupInfo = await (await kit._web3Contracts.getValidators()).methods + .getValidatorGroup(group) + .call() + return groupInfo[0] + } + + return { + async swap() { + const removedMember = members[index % members.length] + await removeMember(members[index % members.length]) + index = index + 1 + const addedMember = members[index % members.length] + await addMember(members[index % members.length]) + const groupMembers = await getGroupMembers() + assert.include(groupMembers, addedMember) + assert.notInclude(groupMembers, removedMember) + }, + } +} + +interface KeyRotator { + rotate(): Promise +} + +async function newKeyRotator( + kit: ContractKit, + web3s: Web3[], + privateKeys: string[] +): Promise { + let index = 0 + const validator = (await kit.web3.eth.getAccounts())[0] + const accountsWrapper = await kit.contracts.getAccounts() + + async function authorizeValidatorSigner(signer: string, signerWeb3: any) { + const signerKit = newKitFromWeb3(signerWeb3) + const pop = await (await signerKit.contracts.getAccounts()).generateProofOfSigningKeyPossession( + validator, + signer + ) + return (await accountsWrapper.authorizeValidatorSigner(signer, pop)).sendAndWaitForReceipt({ + from: validator, + }) + } + + async function updateValidatorBlsKey(signerPrivateKey: string) { + const blsPublicKey = getBlsPublicKey(signerPrivateKey) + const blsPop = getBlsPoP(validator, signerPrivateKey) + // TODO(asa): Send this from the signer instead. + const validatorsWrapper = await kit.contracts.getValidators() + return validatorsWrapper + .updateBlsPublicKey(blsPublicKey, blsPop) + .sendAndWaitForReceipt({ from: validator }) + } + + return { + async rotate() { + if (index < web3s.length) { + const signerWeb3 = web3s[index] + const signer: string = (await signerWeb3.eth.getAccounts())[0] + const signerPrivateKey = privateKeys[index] + await Promise.all([ + authorizeValidatorSigner(signer, signerWeb3), + updateValidatorBlsKey(signerPrivateKey), + ]) + index += 1 + assert.equal(await accountsWrapper.getValidatorSigner(validator), signer) + } + }, + } +} + // TODO(asa): Test independent rotation of ecdsa, bls keys. describe('governance tests', () => { const gethConfig = { @@ -64,11 +158,6 @@ describe('governance tests', () => { accounts = await kit._web3Contracts.getAccounts() } - const unlockAccount = async (address: string, theWeb3: any) => { - // Assuming empty password - await theWeb3.eth.personal.unlockAccount(address, '', 1000) - } - const getValidatorGroupMembers = async (blockNumber?: number) => { if (blockNumber) { const [groupAddress] = await validators.methods @@ -85,7 +174,7 @@ describe('governance tests', () => { } } - const getValidatorSigner = (address: string, blockNumber?: number) => { + const getValidatorSigner = async (address: string, blockNumber?: number) => { if (blockNumber) { return accounts.methods.getValidatorSigner(address).call({}, blockNumber) } else { @@ -107,69 +196,15 @@ describe('governance tests', () => { } const activate = async (account: string, txOptions: any = {}) => { - await unlockAccount(account, web3) const [group] = await validators.methods.getRegisteredValidatorGroups().call() const tx = election.methods.activate(group) let gas = txOptions.gas if (!gas) { - gas = await tx.estimateGas({ ...txOptions }) + gas = (await tx.estimateGas({ ...txOptions })) * 2 } return tx.send({ from: account, ...txOptions, gas }) } - const removeMember = async (groupWeb3: any, member: string, txOptions: any = {}) => { - const group = (await groupWeb3.eth.getAccounts())[0] - await unlockAccount(group, groupWeb3) - const tx = validators.methods.removeMember(member) - let gas = txOptions.gas - if (!gas) { - gas = await tx.estimateGas({ ...txOptions }) - } - return tx.send({ from: group, ...txOptions, gas }) - } - - const addMember = async (groupWeb3: any, member: string, txOptions: any = {}) => { - const group = (await groupWeb3.eth.getAccounts())[0] - await unlockAccount(group, groupWeb3) - const tx = validators.methods.addMember(member) - let gas = txOptions.gas - if (!gas) { - gas = await tx.estimateGas({ ...txOptions }) - } - return tx.send({ from: group, ...txOptions, gas }) - } - - const authorizeValidatorSigner = async (validatorWeb3: any, signerWeb3: any) => { - const validator: string = (await validatorWeb3.eth.getAccounts())[0] - const signer: string = (await signerWeb3.eth.getAccounts())[0] - await unlockAccount(validator, validatorWeb3) - await unlockAccount(signer, signerWeb3) - const pop = await (await newKitFromWeb3( - signerWeb3 - ).contracts.getAccounts()).generateProofOfSigningKeyPossession(validator, signer) - const accountsWrapper = await newKitFromWeb3(validatorWeb3).contracts.getAccounts() - return (await accountsWrapper.authorizeValidatorSigner(signer, pop)).sendAndWaitForReceipt({ - from: validator, - }) - } - - const updateValidatorBlsKey = async ( - validatorWeb3: any, - signerWeb3: any, - signerPrivateKey: string - ) => { - const validator: string = (await validatorWeb3.eth.getAccounts())[0] - const signer: string = (await signerWeb3.eth.getAccounts())[0] - await unlockAccount(signer, signerWeb3) - const blsPublicKey = getBlsPublicKey(signerPrivateKey) - const blsPop = getBlsPoP(validator, signerPrivateKey) - // TODO(asa): Send this from the signer instead. - const validatorsWrapper = await newKitFromWeb3(validatorWeb3).contracts.getValidators() - return validatorsWrapper - .updateBlsPublicKey(blsPublicKey, blsPop) - .sendAndWaitForReceipt({ from: validator }) - } - const isLastBlockOfEpoch = (blockNumber: number, epochSize: number) => { return blockNumber % epochSize === 0 } @@ -269,48 +304,28 @@ describe('governance tests', () => { const groupKit = newKitFromWeb3(groupWeb3) validators = await groupKit._web3Contracts.getValidators() const membersToSwap = [validatorAccounts[0], validatorAccounts[1]] - await removeMember(groupWeb3, membersToSwap[1]) + const memberSwapper = await newMemberSwapper(groupKit, membersToSwap) // Prepare for key rotation. const validatorWeb3 = new Web3('http://localhost:8549') const authorizedWeb3s = [new Web3('ws://localhost:8559'), new Web3('ws://localhost:8561')] const authorizedPrivateKeys = [rotation0PrivateKey, rotation1PrivateKey] + const keyRotator = await newKeyRotator( + newKitFromWeb3(validatorWeb3), + authorizedWeb3s, + authorizedPrivateKeys + ) - let index = 0 let errorWhileChangingValidatorSet = '' - // Can't recycle signing keys. - let doneAuthorizing = false - const changeValidatorSet = async (header: any) => { try { blockNumbers.push(header.number) // At the start of epoch N, perform actions so the validator set is different for epoch N + 1. - if (header.number % epoch === 1) { + // Note that all of these actions MUST complete within the epoch. + if (header.number % epoch === 0 && errorWhileChangingValidatorSet === '') { // 1. Swap validator0 and validator1 so one is a member of the group and the other is not. - const memberToRemove = membersToSwap[index] - const memberToAdd = membersToSwap[(index + 1) % 2] - await removeMember(groupWeb3, memberToRemove) - await addMember(groupWeb3, memberToAdd) - const newMembers = await getValidatorGroupMembers() - assert.include(newMembers, memberToAdd) - assert.notInclude(newMembers, memberToRemove) // 2. Rotate keys for validator 2 by authorizing a new validating key. - if (!doneAuthorizing) { - await authorizeValidatorSigner(validatorWeb3, authorizedWeb3s[index]) - await updateValidatorBlsKey( - validatorWeb3, - authorizedWeb3s[index], - authorizedPrivateKeys[index] - ) - } - doneAuthorizing = doneAuthorizing || index === 1 - const signingKeys = await Promise.all( - newMembers.map((v: string) => getValidatorSigner(v)) - ) - // Confirm that authorizing signing keys worked. - // @ts-ignore Type does not include `notSameMembers` - assert.notSameMembers(newMembers, signingKeys) - index = (index + 1) % 2 + await Promise.all([memberSwapper.swap(), keyRotator.rotate()]) } } catch (e) { console.error(e) @@ -393,7 +408,8 @@ describe('governance tests', () => { } }) - it('should update the validator scores at the end of each epoch', async () => { + it('should update the validator scores at the end of each epoch', async function(this: any) { + this.timeout(0) const adjustmentSpeed = fromFixed( new BigNumber((await validators.methods.getValidatorScoreParameters().call())[1]) ) @@ -447,7 +463,8 @@ describe('governance tests', () => { } }) - it('should distribute epoch payments at the end of each epoch', async () => { + it('should distribute epoch payments at the end of each epoch', async function(this: any) { + this.timeout(0) const commission = 0.1 const targetValidatorEpochPayment = new BigNumber( await epochRewards.methods.targetValidatorEpochPayment().call() @@ -506,7 +523,8 @@ describe('governance tests', () => { } }) - it('should distribute epoch rewards at the end of each epoch', async () => { + it('should distribute epoch rewards at the end of each epoch', async function(this: any) { + this.timeout(0) const lockedGold = await kit._web3Contracts.getLockedGold() const governance = await kit._web3Contracts.getGovernance() const gasPriceMinimum = await kit._web3Contracts.getGasPriceMinimum() diff --git a/packages/celotool/src/e2e-tests/utils.ts b/packages/celotool/src/e2e-tests/utils.ts index 9aaaa882178..02941a966bb 100644 --- a/packages/celotool/src/e2e-tests/utils.ts +++ b/packages/celotool/src/e2e-tests/utils.ts @@ -316,9 +316,13 @@ export async function startGeth(gethBinaryPath: string, instance: GethInstanceCo } if (validating) { - gethArgs.push('--password=/dev/null', `--unlock=0`) gethArgs.push('--mine', '--minerthreads=10', `--nodekeyhex=${privateKey}`) } + + if (privateKey) { + gethArgs.push('--password=/dev/null', `--unlock=0`) + } + const gethProcess = spawnWithLog(gethBinaryPath, gethArgs, `${datadir}/logs.txt`) instance.pid = gethProcess.pid diff --git a/packages/protocol/migrations/08_stabletoken.ts b/packages/protocol/migrations/08_stabletoken.ts index 57a17fbc792..9ce0aa1784a 100644 --- a/packages/protocol/migrations/08_stabletoken.ts +++ b/packages/protocol/migrations/08_stabletoken.ts @@ -49,7 +49,6 @@ module.exports = deploymentForCoreContract( await sortedOracles.addOracle(stableToken.address, oracle) } - console.info('Setting GoldToken/USD exchange rate') // We need to seed the exchange rate, and that must be done with an account // that's accessible to the migrations. It's in an if statement in case this // account happened to be included in config.stableToken.oracles diff --git a/packages/protocol/test/governance/epochrewards.ts b/packages/protocol/test/governance/epochrewards.ts index f9c7b725a7e..cd56251941e 100644 --- a/packages/protocol/test/governance/epochrewards.ts +++ b/packages/protocol/test/governance/epochrewards.ts @@ -67,6 +67,13 @@ contract('EpochRewards', (accounts: string[]) => { const exchangeRate = 7 const mockStableTokenAddress = web3.utils.randomHex(20) const sortedOraclesDenominator = new BigNumber('0x10000000000000000') + const timeTravelToDelta = async (timeDelta: BigNumber) => { + const currentTime = new BigNumber((await web3.eth.getBlock('latest')).timestamp) + const startTime = await epochRewards.startTime() + const desiredTime = startTime.plus(timeDelta) + await timeTravel(desiredTime.minus(currentTime).toNumber(), web3) + } + beforeEach(async () => { epochRewards = await EpochRewards.new() mockElection = await MockElection.new() @@ -402,17 +409,10 @@ contract('EpochRewards', (accounts: string[]) => { ) }) - const timeTravelToDelta = async () => { - const currentTime = new BigNumber((await web3.eth.getBlock('latest')).timestamp) - const startTime = await epochRewards.startTime() - const desiredTime = startTime.plus(timeDelta) - await timeTravel(desiredTime.minus(currentTime).toNumber(), web3) - } - describe('when the target supply is equal to the actual supply after rewards', () => { beforeEach(async () => { await mockGoldToken.setTotalSupply(expectedTargetTotalSupply.minus(targetEpochReward)) - await timeTravelToDelta() + await timeTravelToDelta(timeDelta) }) it('should return one', async () => { @@ -427,7 +427,7 @@ contract('EpochRewards', (accounts: string[]) => { .minus(targetEpochReward) .integerValue(BigNumber.ROUND_FLOOR) await mockGoldToken.setTotalSupply(totalSupply) - await timeTravelToDelta() + await timeTravelToDelta(timeDelta) }) it('should return one plus 10% times the underspend adjustment', async () => { @@ -447,7 +447,7 @@ contract('EpochRewards', (accounts: string[]) => { .minus(targetEpochReward) .integerValue(BigNumber.ROUND_FLOOR) await mockGoldToken.setTotalSupply(totalSupply) - await timeTravelToDelta() + await timeTravelToDelta(timeDelta) }) it('should return one minus 10% times the underspend adjustment', async () => { @@ -542,7 +542,6 @@ contract('EpochRewards', (accounts: string[]) => { beforeEach(async () => { await epochRewards.setNumberValidatorsInCurrentSet(numberValidators) await mockElection.setActiveVotes(activeVotes) - await timeTravel(timeDelta.toNumber(), web3) const expectedTargetTotalEpochPaymentsInGold = targetValidatorEpochPayment .times(numberValidators) .div(exchangeRate) @@ -563,6 +562,7 @@ contract('EpochRewards', (accounts: string[]) => { expectedMultiplier = new BigNumber(1).plus( fromFixed(rewardsMultiplier.adjustments.underspend).times(0.1) ) + await timeTravelToDelta(timeDelta) }) it('should return the target validator epoch payment times the rewards multiplier', async () => { diff --git a/packages/utils/package.json b/packages/utils/package.json index d917d7d40c2..7727b0307a1 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -18,6 +18,7 @@ "dependencies": { "@umpirsky/country-list": "git://github.com/umpirsky/country-list#05fda51", "bignumber.js": "^7.2.0", + "bls12377js": "https://github.com/celo-org/bls12377js#cada1105f4a5e4c2ddd239c1874df3bf33144a10", "bn.js": "4.11.8", "country-data": "^0.0.31", "crypto-js": "^3.1.9-1", From dc510872b46a3e5ff083c1434184ac7535fd4483 Mon Sep 17 00:00:00 2001 From: Nam Chu Hoai Date: Sat, 16 Nov 2019 19:32:02 -0800 Subject: [PATCH 10/61] Support blacklisting country codes for the attestation service (#1738) --- packages/attestation-service/README.md | 33 +++ .../config/.env.development | 4 +- .../20191015211858-create-attestation.js | 8 + packages/attestation-service/nodemon.json | 2 +- .../attestation-service/src/attestation.ts | 198 +++++++++++++++--- packages/attestation-service/src/db.ts | 34 +-- packages/attestation-service/src/index.ts | 5 +- .../src/models/attestation.ts | 40 +++- packages/attestation-service/src/request.ts | 4 + packages/attestation-service/src/sms.ts | 74 ------- packages/attestation-service/src/sms/base.ts | 20 ++ packages/attestation-service/src/sms/index.ts | 32 +++ packages/attestation-service/src/sms/nexmo.ts | 102 +++++++++ packages/utils/src/address.ts | 10 +- 14 files changed, 437 insertions(+), 129 deletions(-) create mode 100644 packages/attestation-service/README.md delete mode 100644 packages/attestation-service/src/sms.ts create mode 100644 packages/attestation-service/src/sms/base.ts create mode 100644 packages/attestation-service/src/sms/index.ts create mode 100644 packages/attestation-service/src/sms/nexmo.ts diff --git a/packages/attestation-service/README.md b/packages/attestation-service/README.md new file mode 100644 index 00000000000..84893323b1a --- /dev/null +++ b/packages/attestation-service/README.md @@ -0,0 +1,33 @@ +# Attestation Service + +A service run by validators on the Celo network to send SMS messages, enabling attestations of user phone numbers and their accounts on the Celo network. + +### Configuration + +You can use the following environment variables to configure the attestation service: + +- `DATABASE_URL` - The URL under which your database is accessible, currently supported are `postgres://`, `mysql://` and `sqlite://` +- `CELO_PROVIDER` - The URL under which a celo blockchain node is reachable, i.e. something like `https://integration-forno.celo-testnet.org` +- `ACCOUNT_ADDRESS` - The address of the account on the `Accounts` smart contract +- `ATTESTATION_KEY` - The private key with which attestations should be signed. You could use your account key for attestations, but really you should authorize a dedicated attestation key +- `APP_SIGNATURE` - The hash with which clients can auto-read SMS messages on android +- `SMS_PROVIDERS` - A comma-separated list of providers you want to configure, we currently support: + +`nexmo` + +- `NEXMO_KEY` - The API key to the Nexmo API +- `NEXMO_SECRET` - The API secret to the Nexmo API +- `NEXMO_BLACKLIST` - A comma-sperated list of country codes you do not want to serve + +### Running locally + +After checking out the source, you should create a local sqlite database by running: + +```sh +yarn run db:create:dev +yarn run db:migrate:dev +``` + +You will also have to set the environment variables in `.env.development` + +Then start the service with `yarn run dev` (you'll have to add the appropriate credentials for the text providers) diff --git a/packages/attestation-service/config/.env.development b/packages/attestation-service/config/.env.development index a8b1540c59f..e5d83040ec2 100644 --- a/packages/attestation-service/config/.env.development +++ b/packages/attestation-service/config/.env.development @@ -3,5 +3,7 @@ CELO_PROVIDER=https://integration-forno.celo-testnet.org ACCOUNT_ADDRESS=0xE6e53b5fc2e18F51781f14a3ce5E7FD468247a15 ATTESTATION_KEY=x APP_SIGNATURE=x +SMS_PROVIDERS=nexmo NEXMO_KEY=x -NEXMO_SECRET=x \ No newline at end of file +NEXMO_SECRET=x +NEXMO_BLACKLIST= diff --git a/packages/attestation-service/migrations/20191015211858-create-attestation.js b/packages/attestation-service/migrations/20191015211858-create-attestation.js index aca5106d69c..e57863ec515 100644 --- a/packages/attestation-service/migrations/20191015211858-create-attestation.js +++ b/packages/attestation-service/migrations/20191015211858-create-attestation.js @@ -23,6 +23,14 @@ module.exports = { allowNull: false, type: Sequelize.STRING, }, + status: { + allowNull: false, + type: Sequelize.STRING, + }, + smsProvider: { + allowNull: false, + type: Sequelize.STRING, + }, createdAt: { allowNull: false, type: Sequelize.DATE, diff --git a/packages/attestation-service/nodemon.json b/packages/attestation-service/nodemon.json index fa8dc8662d2..6e1eeec2d3e 100644 --- a/packages/attestation-service/nodemon.json +++ b/packages/attestation-service/nodemon.json @@ -1,6 +1,6 @@ { "ignore": ["**/*.test.ts", "**/*.spec.ts", ".git", "node_modules"], "watch": ["src"], - "exec": "yarn start", + "exec": "yarn start-ts", "ext": "ts" } diff --git a/packages/attestation-service/src/attestation.ts b/packages/attestation-service/src/attestation.ts index d0d1e004496..42a2b651e77 100644 --- a/packages/attestation-service/src/attestation.ts +++ b/packages/attestation-service/src/attestation.ts @@ -1,12 +1,27 @@ import { AttestationState } from '@celo/contractkit/lib/wrappers/Attestations' import { attestToIdentifier, SignatureUtils } from '@celo/utils' -import { privateKeyToAddress } from '@celo/utils/lib/address' -import { retryAsyncWithBackOff } from '@celo/utils/lib/async' -import { Address, AddressType, E164Number, E164PhoneNumberType } from '@celo/utils/lib/io' +import { + Address, + isValidPrivateKey, + privateKeyToAddress, + toChecksumAddress, +} from '@celo/utils/lib/address' +import { AddressType, E164Number, E164PhoneNumberType } from '@celo/utils/lib/io' +import { isValidAddress } from 'ethereumjs-util' import express from 'express' import * as t from 'io-ts' -import { existingAttestationRequest, kit, persistAttestationRequest } from './db' -import { sendSms } from './sms' +import { Transaction } from 'sequelize' +import { existingAttestationRequestRecord, getAttestationTable, kit, sequelize } from './db' +import { AttestationModel, AttestationStatus } from './models/attestation' +import { respondWithError } from './request' +import { smsProviderFor } from './sms' +import { SmsProviderType } from './sms/base' + +const SMS_SENDING_ERROR = 'Something went wrong while attempting to send SMS, try again later' +const ATTESTATION_ERROR = 'Valid attestation could not be provided' +const NO_INCOMPLETE_ATTESTATION_FOUND_ERROR = 'No incomplete attestation found' +const ATTESTATION_ALREADY_SENT_ERROR = 'Attestation already sent' +const COUNTRY_CODE_NOT_SERVED_ERROR = 'Your country code is not being served by this service' export const AttestationRequestType = t.type({ phoneNumber: E164PhoneNumberType, @@ -16,25 +31,39 @@ export const AttestationRequestType = t.type({ export type AttestationRequest = t.TypeOf -function getAttestationKey() { - if (process.env.ATTESTATION_KEY === undefined) { - console.error('Did not specify ATTESTATION_KEY') - throw new Error('Did not specify ATTESTATION_KEY') +export function getAttestationKey() { + if ( + process.env.ATTESTATION_KEY === undefined || + !isValidPrivateKey(process.env.ATTESTATION_KEY) + ) { + console.error('Did not specify valid ATTESTATION_KEY') + throw new Error('Did not specify valid ATTESTATION_KEY') } return process.env.ATTESTATION_KEY } +export function getAccountAddress() { + if (process.env.ACCOUNT_ADDRESS === undefined || !isValidAddress(process.env.ACCOUNT_ADDRESS)) { + console.error('Did not specify valid ACCOUNT_ADDRESS') + throw new Error('Did not specify valid ACCOUNT_ADDRESS') + } + + return toChecksumAddress(process.env.ACCOUNT_ADDRESS) +} + async function validateAttestationRequest(request: AttestationRequest) { + const attestationRecord = await existingAttestationRequestRecord( + request.phoneNumber, + request.account, + request.issuer + ) // check if it exists in the database - if ( - (await existingAttestationRequest(request.phoneNumber, request.account, request.issuer)) !== - null - ) { - throw new Error('Attestation already sent') + if (attestationRecord && !attestationRecord.canSendSms()) { + console.log(attestationRecord.canSendSms()) + throw new Error(ATTESTATION_ALREADY_SENT_ERROR) } - const key = getAttestationKey() - const address = privateKeyToAddress(key) + const address = getAccountAddress() // TODO: Check with the new Accounts.sol if (address.toLowerCase() !== request.issuer.toLowerCase()) { @@ -49,7 +78,7 @@ async function validateAttestationRequest(request: AttestationRequest) { ) if (state.attestationState !== AttestationState.Incomplete) { - throw new Error('No incomplete attestation found') + throw new Error(NO_INCOMPLETE_ATTESTATION_FOUND_ERROR) } // TODO: Check expiration @@ -60,15 +89,18 @@ async function validateAttestation( attestationRequest: AttestationRequest, attestationCode: string ) { + const key = getAttestationKey() + const address = privateKeyToAddress(key) const attestations = await kit.contracts.getAttestations() const isValid = await attestations.validateAttestationCode( attestationRequest.phoneNumber, attestationRequest.account, - attestationRequest.issuer, + address, attestationCode ) + if (!isValid) { - throw new Error('Valid attestation could not be provided') + throw new Error(ATTESTATION_ERROR) } return } @@ -87,6 +119,115 @@ function createAttestationTextMessage(attestationCode: string) { return `<#> ${toBase64(attestationCode)} ${process.env.APP_SIGNATURE}` } +async function ensureLockedRecord( + attestationRequest: AttestationRequest, + transaction: Transaction +) { + const AttestationTable = await getAttestationTable() + await AttestationTable.findOrCreate({ + where: { + phoneNumber: attestationRequest.phoneNumber, + account: attestationRequest.account, + issuer: attestationRequest.issuer, + }, + defaults: { + smsProvider: SmsProviderType.UNKNOWN, + status: AttestationStatus.DISPATCHING, + }, + transaction, + }) + + // Query to lock the record + const attestationRecord = await existingAttestationRequestRecord( + attestationRequest.phoneNumber, + attestationRequest.account, + attestationRequest.issuer, + { transaction, lock: Transaction.LOCK.UPDATE } + ) + + if (!attestationRecord) { + // This should never happen + throw new Error(`Somehow we did not get an attestation record`) + } + + if (!attestationRecord.canSendSms()) { + // Another transaction has locked on the record before we did + throw new Error(`Another process has already sent the sms`) + } + + return attestationRecord +} + +async function sendSmsAndPersistAttestation( + attestationRequest: AttestationRequest, + attestationCode: string +) { + const textMessage = createAttestationTextMessage(attestationCode) + let attestationRecord: AttestationModel | null = null + + const transaction = await sequelize!.transaction() + + try { + attestationRecord = await ensureLockedRecord(attestationRequest, transaction) + const provider = smsProviderFor(attestationRequest.phoneNumber) + + if (!provider) { + await attestationRecord.update( + { status: AttestationStatus.UNABLE_TO_SERVE, smsProvider: SmsProviderType.UNKNOWN }, + { transaction } + ) + await transaction.commit() + return attestationRecord + } + + try { + await provider.sendSms(attestationRequest.phoneNumber, textMessage) + await attestationRecord.update( + { status: AttestationStatus.SENT, smsProvider: provider.type }, + { transaction } + ) + } catch (error) { + await attestationRecord.update( + { status: AttestationStatus.FAILED, smsProvider: provider.type }, + { transaction } + ) + } + + await transaction.commit() + } catch (error) { + console.error(error) + await transaction.rollback() + } + + return attestationRecord +} + +function respondAfterSendingSms(res: express.Response, attestationRecord: AttestationModel | null) { + if (!attestationRecord) { + console.error('Attestation Record was not created') + respondWithError(res, 500, SMS_SENDING_ERROR) + return + } + + switch (attestationRecord.status) { + case AttestationStatus.SENT: + res.status(201).json({ success: true }) + return + case AttestationStatus.FAILED: + respondWithError(res, 500, SMS_SENDING_ERROR) + return + case AttestationStatus.UNABLE_TO_SERVE: + respondWithError(res, 422, COUNTRY_CODE_NOT_SERVED_ERROR) + default: + console.error( + 'Attestation Record should either be failed or sent, but was ', + attestationRecord.status + ) + respondWithError(res, 500, SMS_SENDING_ERROR) + return + } +} + export async function handleAttestationRequest( _req: express.Request, res: express.Response, @@ -99,26 +240,19 @@ export async function handleAttestationRequest( await validateAttestation(attestationRequest, attestationCode) } catch (error) { console.error(error) - res.status(422).json({ success: false, error: error.toString() }) + respondWithError(res, 422, error.toString()) return } try { - const textMessage = createAttestationTextMessage(attestationCode) - await persistAttestationRequest( - attestationRequest.phoneNumber, - attestationRequest.account, - attestationRequest.issuer + const attestationRecord = await sendSmsAndPersistAttestation( + attestationRequest, + attestationCode ) - await retryAsyncWithBackOff(sendSms, 10, [attestationRequest.phoneNumber, textMessage], 1000) + respondAfterSendingSms(res, attestationRecord) } catch (error) { console.error(error) - res.status(500).json({ - success: false, - error: 'Something went wrong while attempting to send SMS, try again later', - }) + respondWithError(res, 500, SMS_SENDING_ERROR) return } - - res.json({ success: true }) } diff --git a/packages/attestation-service/src/db.ts b/packages/attestation-service/src/db.ts index 5a75590d85c..feec25c5bfd 100644 --- a/packages/attestation-service/src/db.ts +++ b/packages/attestation-service/src/db.ts @@ -1,7 +1,7 @@ import { ContractKit, newKit } from '@celo/contractkit' -import { Sequelize } from 'sequelize' +import { FindOptions, Sequelize } from 'sequelize' import { fetchEnv } from './env' -import Attestation, { AttestationStatic } from './models/attestation' +import Attestation, { AttestationModel, AttestationStatic } from './models/attestation' export let sequelize: Sequelize | undefined @@ -15,15 +15,21 @@ export function initializeDB() { export let kit: ContractKit -export function initializeKit() { +export async function initializeKit() { if (kit === undefined) { kit = newKit(fetchEnv('CELO_PROVIDER')) + const blockNumber = await kit.web3.eth.getBlockNumber() + if (blockNumber === 0) { + throw new Error( + 'Could not fetch latest block from web3 provider ' + fetchEnv('CELO_PROVIDER') + ) + } } } let AttestationTable: AttestationStatic -async function getAttestationTable() { +export async function getAttestationTable() { if (AttestationTable) { return AttestationTable } @@ -31,18 +37,14 @@ async function getAttestationTable() { return AttestationTable } -export async function existingAttestationRequest( +export async function existingAttestationRequestRecord( phoneNumber: string, account: string, - issuer: string -): Promise { - return (await getAttestationTable()).findOne({ where: { phoneNumber, account, issuer } }) -} - -export async function persistAttestationRequest( - phoneNumber: string, - account: string, - issuer: string -) { - return (await getAttestationTable()).create({ phoneNumber, account, issuer }) + issuer: string, + options: FindOptions = {} +): Promise { + return (await getAttestationTable()).findOne({ + where: { phoneNumber, account, issuer }, + ...options, + }) } diff --git a/packages/attestation-service/src/index.ts b/packages/attestation-service/src/index.ts index 8b7d059f1f1..38cce839c13 100644 --- a/packages/attestation-service/src/index.ts +++ b/packages/attestation-service/src/index.ts @@ -1,17 +1,20 @@ import * as dotenv from 'dotenv' import express from 'express' -import { AttestationRequestType, handleAttestationRequest } from './attestation' +import { AttestationRequestType, getAttestationKey, handleAttestationRequest } from './attestation' import { initializeDB, initializeKit } from './db' import { createValidatedHandler } from './request' import { initializeSmsProviders } from './sms' async function init() { + console.info(process.env.CONFIG) if (process.env.CONFIG) { dotenv.config({ path: process.env.CONFIG }) } await initializeDB() await initializeKit() + // TODO: Validate that the attestation key has been authorized by the account + getAttestationKey() await initializeSmsProviders() const app = express() diff --git a/packages/attestation-service/src/models/attestation.ts b/packages/attestation-service/src/models/attestation.ts index a2b79e765b7..24e24e7d092 100644 --- a/packages/attestation-service/src/models/attestation.ts +++ b/packages/attestation-service/src/models/attestation.ts @@ -1,18 +1,52 @@ import { BuildOptions, DataTypes, Model, Sequelize } from 'sequelize' +import { SmsProviderType } from '../sms/base' -interface AttestationModel extends Model { +export interface AttestationModel extends Model { readonly id: number account: string phoneNumber: string issuer: string + status: AttestationStatus + smsProvider: SmsProviderType + + canSendSms: () => boolean +} + +export enum AttestationStatus { + DISPATCHING = 'DISPATCHING', + UNABLE_TO_SERVE = 'UNABLE_TO_SERVE', + FAILED = 'FAILED', + SENT = 'SMS_SEND_SUCCESS', + COMPLETE = 'COMPLETE', } export type AttestationStatic = typeof Model & (new (values?: object, options?: BuildOptions) => AttestationModel) -export default (sequelize: Sequelize) => - sequelize.define('Attestations', { +export default (sequelize: Sequelize) => { + const model = sequelize.define('Attestations', { account: DataTypes.STRING, phoneNumber: DataTypes.STRING, issuer: DataTypes.STRING, + status: DataTypes.STRING, + smsProvider: DataTypes.STRING, }) as AttestationStatic + + model.prototype.canSendSms = function() { + console.log( + this.status, + [ + AttestationStatus.DISPATCHING, + AttestationStatus.FAILED, + AttestationStatus.UNABLE_TO_SERVE, + ].includes(this.status) + ) + return [ + AttestationStatus.DISPATCHING, + AttestationStatus.FAILED, + AttestationStatus.UNABLE_TO_SERVE, + ].includes(this.status) + } + + return model +} diff --git a/packages/attestation-service/src/request.ts b/packages/attestation-service/src/request.ts index e3d7bd9b6c6..ea46ee6f515 100644 --- a/packages/attestation-service/src/request.ts +++ b/packages/attestation-service/src/request.ts @@ -48,3 +48,7 @@ function serializeErrors(errors: t.Errors) { }) return serializedErrors } + +export function respondWithError(res: express.Response, statusCode: number, error: string) { + res.status(statusCode).json({ success: false, error }) +} diff --git a/packages/attestation-service/src/sms.ts b/packages/attestation-service/src/sms.ts deleted file mode 100644 index 96faca6500f..00000000000 --- a/packages/attestation-service/src/sms.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { PhoneNumberUtil } from 'google-libphonenumber' -import Nexmo from 'nexmo' -import { fetchEnv } from './env' - -const phoneUtil = PhoneNumberUtil.getInstance() - -let nexmoClient: any -let nexmoNumbers: Array<{ - code: string - phoneNumber: string -}> = [] - -export async function initializeSmsProviders() { - nexmoClient = new Nexmo({ - apiKey: fetchEnv('NEXMO_KEY'), - apiSecret: fetchEnv('NEXMO_SECRET'), - }) - - const availableNumbers = await getAvailableNumbers() - - nexmoNumbers = availableNumbers.map((number: any) => ({ - phoneNumber: number.msisdn, - code: phoneUtil.getRegionCodeForNumber(phoneUtil.parse('+' + number.msisdn)), - })) - - console.log(nexmoNumbers) -} - -async function getAvailableNumbers(): Promise { - return new Promise((resolve, reject) => { - nexmoClient.number.get(null, (err: Error, responseData: any) => { - if (err) { - reject(err) - } else { - resolve(responseData.numbers) - } - }) - }) -} - -function getMatchingNumber(countryCode: string) { - const matchingNumber = nexmoNumbers.find((number) => number.code === countryCode) - if (matchingNumber !== undefined) { - return matchingNumber.phoneNumber - } - return nexmoNumbers[0].phoneNumber -} - -export async function sendSms(phoneNumber: string, message: string): Promise { - const countryCode = phoneUtil.getRegionCodeForNumber(phoneUtil.parse(phoneNumber)) - - if (!countryCode) { - throw new Error('could not extract country code') - } - - return new Promise((resolve, reject) => { - nexmoClient.message.sendSms( - getMatchingNumber(countryCode), - phoneNumber, - message, - (err: Error, responseData: any) => { - if (err) { - reject(err) - } else { - if (responseData.messages[0].status === '0') { - resolve(responseData.messages[0]) - } else { - reject(responseData.messages[0]['error-text']) - } - } - } - ) - }) -} diff --git a/packages/attestation-service/src/sms/base.ts b/packages/attestation-service/src/sms/base.ts new file mode 100644 index 00000000000..326aa1c6900 --- /dev/null +++ b/packages/attestation-service/src/sms/base.ts @@ -0,0 +1,20 @@ +import { E164Number } from '@celo/utils/lib/io' +import { PhoneNumberUtil } from 'google-libphonenumber' +const phoneUtil = PhoneNumberUtil.getInstance() + +export abstract class SmsProvider { + abstract type: SmsProviderType + blacklistedRegionCodes: string[] = [] + + canServePhoneNumber(phoneNumber: E164Number) { + const countryCode = phoneUtil.getRegionCodeForNumber(phoneUtil.parse(phoneNumber)) + return !!countryCode && !this.blacklistedRegionCodes.includes(countryCode) + } + // Should throw Error when unsuccesful, return if successful + abstract sendSms(phoneNumber: E164Number, message: string): Promise +} + +export enum SmsProviderType { + NEXMO = 'nexmo', + UNKNOWN = 'unknown', +} diff --git a/packages/attestation-service/src/sms/index.ts b/packages/attestation-service/src/sms/index.ts new file mode 100644 index 00000000000..58c6a701e03 --- /dev/null +++ b/packages/attestation-service/src/sms/index.ts @@ -0,0 +1,32 @@ +import { E164Number } from '@celo/utils/lib/io' +import { fetchEnv } from '../env' +import { SmsProvider, SmsProviderType } from './base' +import { NexmoSmsProvider } from './nexmo' + +const smsProviders: SmsProvider[] = [] + +export async function initializeSmsProviders() { + const configuredSmsProviders = fetchEnv('SMS_PROVIDERS').split(',') as Array< + SmsProviderType | string + > + + if (configuredSmsProviders.length === 0) { + throw new Error('You have to specify at least one sms provider') + } + + for (const configuredSmsProvider of configuredSmsProviders) { + switch (configuredSmsProvider) { + case SmsProviderType.NEXMO: + const provider = NexmoSmsProvider.fromEnv() + await provider.initialize() + smsProviders.push(provider) + break + default: + break + } + } +} + +export function smsProviderFor(phoneNumber: E164Number) { + return smsProviders.find((provider) => provider.canServePhoneNumber(phoneNumber)) +} diff --git a/packages/attestation-service/src/sms/nexmo.ts b/packages/attestation-service/src/sms/nexmo.ts new file mode 100644 index 00000000000..90d4107a898 --- /dev/null +++ b/packages/attestation-service/src/sms/nexmo.ts @@ -0,0 +1,102 @@ +import { retryAsyncWithBackOff } from '@celo/utils/lib/async' +import { E164Number } from '@celo/utils/lib/io' +import { PhoneNumberUtil } from 'google-libphonenumber' +import Nexmo from 'nexmo' +import { fetchEnv } from '../env' +import { SmsProvider, SmsProviderType } from './base' + +const phoneUtil = PhoneNumberUtil.getInstance() + +export class NexmoSmsProvider extends SmsProvider { + static fromEnv() { + return new NexmoSmsProvider( + fetchEnv('NEXMO_KEY'), + fetchEnv('NEXMO_SECRET'), + fetchEnv('NEXMO_BLACKLIST').split(',') + ) + } + type = SmsProviderType.NEXMO + client: any + nexmoNumbers: Array<{ + code: string + phoneNumber: string + }> = [] + + constructor(apiKey: string, apiSecret: string, blacklistedRegionCodes: string[]) { + super() + this.client = new Nexmo({ + apiKey, + apiSecret, + }) + + this.blacklistedRegionCodes = blacklistedRegionCodes + } + + initialize = async () => { + const availableNumbers = await this.getAvailableNumbers() + this.nexmoNumbers = availableNumbers.map((number: any) => ({ + phoneNumber: number.msisdn, + code: phoneUtil.getRegionCodeForNumber(phoneUtil.parse('+' + number.msisdn)), + })) + } + + sendSms = async (phoneNumber: E164Number, message: string): Promise => { + const countryCode = phoneUtil.getRegionCodeForNumber(phoneUtil.parse(phoneNumber)) + + if (!countryCode) { + throw new Error('could not extract country code') + } + + const nexmoNumber = this.getMatchingNumber(countryCode) + // Nexmo does not support sending more than 1 text message a second from some phone numbers, so just + // repeat with backoff + await retryAsyncWithBackOff( + () => this.sendSmsViaNexmo(nexmoNumber, phoneNumber, message), + 10, + [], + 1000 + ) + return + } + + private sendSmsViaNexmo(nexmoNumber: string, phoneNumber: string, message: string) { + return new Promise((resolve, reject) => { + this.client.message.sendSms( + nexmoNumber, + phoneNumber, + message, + (err: Error, responseData: any) => { + if (err) { + reject(err) + } else { + if (responseData.messages[0].status === '0') { + resolve(responseData.messages[0]) + } else { + reject(responseData.messages[0]['error-text']) + } + } + } + ) + }) + } + + private getAvailableNumbers = async (): Promise => { + return new Promise((resolve, reject) => { + this.client.number.get(null, (err: Error, responseData: any) => { + if (err) { + reject(err) + } else { + resolve(responseData.numbers) + } + }) + }) + } + + private getMatchingNumber = (countryCode: string) => { + const matchingNumber = this.nexmoNumbers.find((number) => number.code === countryCode) + if (matchingNumber !== undefined) { + return matchingNumber.phoneNumber + } + return this.nexmoNumbers[0].phoneNumber + } +} diff --git a/packages/utils/src/address.ts b/packages/utils/src/address.ts index 92f846ebbf1..ccfe61988a6 100644 --- a/packages/utils/src/address.ts +++ b/packages/utils/src/address.ts @@ -1,4 +1,10 @@ -import { privateToAddress, privateToPublic, pubToAddress, toChecksumAddress } from 'ethereumjs-util' +import { + isValidPrivate, + privateToAddress, + privateToPublic, + pubToAddress, + toChecksumAddress, +} from 'ethereumjs-util' export type Address = string @@ -43,6 +49,8 @@ export function stripHexLeader(hexString: string): string { export function ensureHexLeader(hexString: string): string { return '0x' + stripHexLeader(hexString) } +export const isValidPrivateKey = (privateKey: string) => + privateKey.startsWith('0x') && isValidPrivate(Buffer.from(privateKey.slice(2), 'hex')) export { isValidAddress } from 'ethereumjs-util' export { toChecksumAddress } from 'ethereumjs-util' From 7abb9b5f79eb67869f96dc6e56c55d25bf46fbc1 Mon Sep 17 00:00:00 2001 From: Audrey Penven Date: Mon, 18 Nov 2019 13:59:05 +0100 Subject: [PATCH 11/61] whitelist oracle account and fund in the genesis block (#1725) This does the setup for an oracle account on a network. It adds a new type of account that has its address and private key generated from the mnemonic. This account is included as an oracle for StableToken in the migration overrides that are set when deploying with celotool. By being included in that set, it is whitelisted as an oracle, and funded in the genesis block to cover transaction fees. --- packages/celotool/src/cmds/deploy/initial/contracts.ts | 1 + packages/celotool/src/lib/generate_utils.ts | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/celotool/src/cmds/deploy/initial/contracts.ts b/packages/celotool/src/cmds/deploy/initial/contracts.ts index fdfe62f4e62..6459cb35350 100644 --- a/packages/celotool/src/cmds/deploy/initial/contracts.ts +++ b/packages/celotool/src/cmds/deploy/initial/contracts.ts @@ -120,6 +120,7 @@ export const handler = async (argv: InitialArgv) => { () => '60000000000000000000000' ), // 60k Celo Dollars }, + oracles: getAddressesFor(AccountType.PRICE_ORACLE, mnemonic, 1), }, }) diff --git a/packages/celotool/src/lib/generate_utils.ts b/packages/celotool/src/lib/generate_utils.ts index c9dbc6d5130..8ac29e1e909 100644 --- a/packages/celotool/src/lib/generate_utils.ts +++ b/packages/celotool/src/lib/generate_utils.ts @@ -28,6 +28,7 @@ export enum AccountType { BOOTNODE = 3, FAUCET = 4, ATTESTATION = 5, + PRICE_ORACLE = 6, } export enum ConsensusType { @@ -47,6 +48,7 @@ export const MNEMONIC_ACCOUNT_TYPE_CHOICES = [ 'bootnode', 'faucet', 'attestation', + 'price_oracle', ] export const add0x = (str: string) => { @@ -143,11 +145,13 @@ export const generateGenesisFromEnv = (enablePetersburg: boolean = true) => { // Assing DEFAULT ammount of gold to 2 faucet accounts const faucetAddresses = getStrippedAddressesFor(AccountType.FAUCET, mnemonic, 2) + const oracleAddress = getStrippedAddressesFor(AccountType.PRICE_ORACLE, mnemonic, 1) + return generateGenesis({ validators, consensusType, blockTime, - initialAccounts: faucetAddresses, + initialAccounts: faucetAddresses.concat(oracleAddress), epoch, chainId, requestTimeout, From cfc188a007b418edb1d99b43a086ad52e32c96cc Mon Sep 17 00:00:00 2001 From: Nam Chu Hoai Date: Mon, 18 Nov 2019 09:40:41 -0800 Subject: [PATCH 12/61] Add @celo/dev-utils (#1753) --- dockerfiles/attestation-service/Dockerfile | 2 + dockerfiles/celotool/Dockerfile | 2 + packages/cli/jest.config.js | 2 +- packages/cli/package.json | 1 + .../src/commands/account/authorize.test.ts | 2 +- .../cli/src/commands/account/claims.test.ts | 2 +- .../cli/src/commands/account/register.test.ts | 2 +- packages/cli/src/test-utils/ganache.setup.ts | 59 +------------ .../cli/src/test-utils/ganache.teardown.ts | 9 +- packages/contractkit/jest.config.js | 2 +- packages/contractkit/package.json | 3 +- .../src/identity/claims/account.test.ts | 4 +- .../contractkit/src/identity/metadata.test.ts | 4 +- .../src/test-utils/ganache-test.ts | 72 ---------------- .../src/test-utils/ganache.setup.ts | 84 +------------------ .../src/test-utils/ganache.teardown.ts | 9 +- .../contractkit/src/test-utils/matchers.ts | 42 ---------- .../contractkit/src/utils/signing.test.ts | 4 +- .../contractkit/src/utils/tx-signing.test.ts | 2 +- .../contractkit/src/wrappers/Accounts.test.ts | 2 +- .../contractkit/src/wrappers/Exchange.test.ts | 2 +- .../src/wrappers/GoldToken.test.ts | 2 +- .../src/wrappers/SortedOracles.test.ts | 2 +- .../src/wrappers/StableToken.test.ts | 2 +- .../src/wrappers/Validators.test.ts | 2 +- packages/dev-utils/.gitignore | 1 + packages/dev-utils/package.json | 28 +++++++ packages/dev-utils/src/ganache-setup.ts | 82 ++++++++++++++++++ packages/dev-utils/src/ganache-teardown.ts | 7 ++ .../src}/ganache-test.ts | 3 + .../test-utils => dev-utils/src}/matchers.ts | 0 .../src}/migration-override.json | 0 packages/dev-utils/tsconfig.json | 9 ++ packages/dev-utils/tslint.json | 9 ++ 34 files changed, 174 insertions(+), 284 deletions(-) delete mode 100644 packages/contractkit/src/test-utils/ganache-test.ts delete mode 100644 packages/contractkit/src/test-utils/matchers.ts create mode 100644 packages/dev-utils/.gitignore create mode 100644 packages/dev-utils/package.json create mode 100644 packages/dev-utils/src/ganache-setup.ts create mode 100644 packages/dev-utils/src/ganache-teardown.ts rename packages/{cli/src/test-utils => dev-utils/src}/ganache-test.ts (93%) rename packages/{cli/src/test-utils => dev-utils/src}/matchers.ts (100%) rename packages/{contractkit/src/test-utils => dev-utils/src}/migration-override.json (100%) create mode 100644 packages/dev-utils/tsconfig.json create mode 100644 packages/dev-utils/tslint.json diff --git a/dockerfiles/attestation-service/Dockerfile b/dockerfiles/attestation-service/Dockerfile index 935a1e6c7c7..e1461e07612 100644 --- a/dockerfiles/attestation-service/Dockerfile +++ b/dockerfiles/attestation-service/Dockerfile @@ -8,6 +8,7 @@ COPY scripts/ scripts/ # Copy only pkg.json COPY packages/typescript/package.json packages/typescript/ COPY packages/utils/package.json packages/utils/ +COPY packages/dev-utils/package.json packages/dev-utils/ COPY packages/protocol/package.json packages/protocol/ COPY packages/contractkit/package.json packages/contractkit/ COPY packages/attestation-service/package.json packages/attestation-service/ @@ -17,6 +18,7 @@ RUN yarn install --frozen-lockfile --network-timeout 100000 && yarn cache clean # Copy the rest COPY packages/typescript packages/typescript/ COPY packages/utils packages/utils/ +COPY packages/dev-utils packages/dev-utils/ COPY packages/protocol packages/protocol/ COPY packages/contractkit packages/contractkit/ COPY packages/attestation-service packages/attestation-service/ diff --git a/dockerfiles/celotool/Dockerfile b/dockerfiles/celotool/Dockerfile index 851a8d057ef..da6a7409bcd 100644 --- a/dockerfiles/celotool/Dockerfile +++ b/dockerfiles/celotool/Dockerfile @@ -16,6 +16,7 @@ RUN apt-get update && \ COPY lerna.json package.json yarn.lock ./ COPY scripts/ scripts/ COPY packages/utils/package.json packages/utils/ +COPY packages/dev-utils/package.json packages/dev-utils/ COPY packages/typescript/package.json packages/typescript/ COPY packages/walletkit/package.json packages/walletkit/ COPY packages/contractkit/package.json packages/contractkit/ @@ -26,6 +27,7 @@ COPY packages/celotool/package.json packages/celotool/ RUN yarn install --network-timeout 100000 --frozen-lockfile && yarn cache clean COPY packages/utils packages/utils/ +COPY packages/dev-utils packages/dev-utils/ COPY packages/typescript packages/typescript/ COPY packages/walletkit packages/walletkit/ COPY packages/contractkit packages/contractkit/ diff --git a/packages/cli/jest.config.js b/packages/cli/jest.config.js index aa5c4c41f55..c30f58fd842 100644 --- a/packages/cli/jest.config.js +++ b/packages/cli/jest.config.js @@ -2,7 +2,7 @@ module.exports = { preset: 'ts-jest', testEnvironment: 'node', testMatch: ['/src/**/?(*.)+(spec|test).ts?(x)'], - setupFilesAfterEnv: ['/src/test-utils/matchers.ts'], + setupFilesAfterEnv: ['@celo/dev-utils/lib/matchers'], globalSetup: '/src/test-utils/ganache.setup.ts', globalTeardown: '/src/test-utils/ganache.teardown.ts', } diff --git a/packages/cli/package.json b/packages/cli/package.json index 3e7444c9503..1eeebe5731f 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -55,6 +55,7 @@ }, "devDependencies": { "@celo/dev-cli": "^2.0.3", + "@celo/dev-utils": "0.0.1-dev", "@types/bip32": "^1.0.1", "@types/bip39": "^2.4.2", "@types/cli-table": "^0.3.0", diff --git a/packages/cli/src/commands/account/authorize.test.ts b/packages/cli/src/commands/account/authorize.test.ts index fada8a235c7..4d3340c1e75 100644 --- a/packages/cli/src/commands/account/authorize.test.ts +++ b/packages/cli/src/commands/account/authorize.test.ts @@ -1,5 +1,5 @@ +import { testWithGanache } from '@celo/dev-utils/lib/ganache-test' import Web3 from 'web3' -import { testWithGanache } from '../../test-utils/ganache-test' import Authorize from './authorize' import Register from './register' diff --git a/packages/cli/src/commands/account/claims.test.ts b/packages/cli/src/commands/account/claims.test.ts index 6cb91fb8ce9..83a723647ba 100644 --- a/packages/cli/src/commands/account/claims.test.ts +++ b/packages/cli/src/commands/account/claims.test.ts @@ -1,9 +1,9 @@ import { IdentityMetadataWrapper, newKitFromWeb3 } from '@celo/contractkit' import { ClaimTypes } from '@celo/contractkit/lib/identity' +import { testWithGanache } from '@celo/dev-utils/lib/ganache-test' import { readFileSync, writeFileSync } from 'fs' import { tmpdir } from 'os' import Web3 from 'web3' -import { testWithGanache } from '../../test-utils/ganache-test' import ClaimAccount from './claim-account' import ClaimDomain from './claim-domain' import ClaimName from './claim-name' diff --git a/packages/cli/src/commands/account/register.test.ts b/packages/cli/src/commands/account/register.test.ts index 444dd71a0bc..0759f320d84 100644 --- a/packages/cli/src/commands/account/register.test.ts +++ b/packages/cli/src/commands/account/register.test.ts @@ -1,5 +1,5 @@ +import { testWithGanache } from '@celo/dev-utils/lib/ganache-test' import Web3 from 'web3' -import { testWithGanache } from '../../test-utils/ganache-test' import Register from './register' process.env.NO_SYNCCHECK = 'true' diff --git a/packages/cli/src/test-utils/ganache.setup.ts b/packages/cli/src/test-utils/ganache.setup.ts index de02dd978c3..8e9006bf714 100644 --- a/packages/cli/src/test-utils/ganache.setup.ts +++ b/packages/cli/src/test-utils/ganache.setup.ts @@ -1,61 +1,6 @@ -// @ts-ignore -import * as ganache from '@celo/ganache-cli' +import baseSetup from '@celo/dev-utils/lib/ganache-setup' import * as path from 'path' -const MNEMONIC = 'concert load couple harbor equip island argue ramp clarify fence smart topic' - -export async function startGanache(datadir: string, opts: { verbose?: boolean } = {}) { - const logFn = opts.verbose - ? // tslint:disable-next-line: no-console - (...args: any[]) => console.log(...args) - : () => { - /*nothing*/ - } - - const server = ganache.server({ - default_balance_ether: 1000000, - logger: { - log: logFn, - }, - network_id: 1101, - db_path: datadir, - mnemonic: MNEMONIC, - gasLimit: 7000000, - allowUnlimitedContractSize: true, - }) - - await new Promise((resolve, reject) => { - server.listen(8545, (err: any, blockchain: any) => { - if (err) { - reject(err) - } else { - resolve(blockchain) - } - }) - }) - - return () => - new Promise((resolve, reject) => { - server.close((err: any) => { - if (err) { - reject(err) - } else { - resolve() - } - }) - }) -} - export default function setup() { - const DATADIR = path.resolve(path.join(__dirname, '../../.devchain')) - // console.log('Starting Ganache: datadir=', DATADIR) - return startGanache(DATADIR) - .then((stopGanache) => { - ;(global as any).stopGanache = stopGanache - }) - .catch((err) => { - console.error('Error starting ganache, Doing `yarn test:prepare` might help') - console.error(err) - process.exit(1) - }) + return baseSetup(path.resolve(path.join(__dirname, '../../.devchain'))) } diff --git a/packages/cli/src/test-utils/ganache.teardown.ts b/packages/cli/src/test-utils/ganache.teardown.ts index 27400b9a1aa..c37e9bb00a0 100644 --- a/packages/cli/src/test-utils/ganache.teardown.ts +++ b/packages/cli/src/test-utils/ganache.teardown.ts @@ -1,7 +1,2 @@ -export default function tearDown() { - console.log('Stopping ganache') - return (global as any).stopGanache().catch((err: any) => { - console.error('error stopping ganache') - console.error(err) - }) -} +import teardown from '@celo/dev-utils/lib/ganache-teardown' +export default teardown diff --git a/packages/contractkit/jest.config.js b/packages/contractkit/jest.config.js index aa5c4c41f55..c30f58fd842 100644 --- a/packages/contractkit/jest.config.js +++ b/packages/contractkit/jest.config.js @@ -2,7 +2,7 @@ module.exports = { preset: 'ts-jest', testEnvironment: 'node', testMatch: ['/src/**/?(*.)+(spec|test).ts?(x)'], - setupFilesAfterEnv: ['/src/test-utils/matchers.ts'], + setupFilesAfterEnv: ['@celo/dev-utils/lib/matchers'], globalSetup: '/src/test-utils/ganache.setup.ts', globalTeardown: '/src/test-utils/ganache.teardown.ts', } diff --git a/packages/contractkit/package.json b/packages/contractkit/package.json index f20cff2dfd8..290e70aa4c7 100644 --- a/packages/contractkit/package.json +++ b/packages/contractkit/package.json @@ -20,7 +20,7 @@ "clean:all": "yarn clean && rm -rf src/generated", "build:gen": "yarn --cwd ../protocol build", "prepublishOnly": "yarn build:gen && yarn build", - "test:prepare": "yarn --cwd ../protocol devchain generate .devchain --migration_override src/test-utils/migration-override.json", + "test:prepare": "yarn --cwd ../protocol devchain generate .devchain --migration_override ../dev-utils/src/migration-override.json", "test": "jest --runInBand", "lint": "tslint -c tslint.json --project ." }, @@ -40,6 +40,7 @@ "web3-utils": "1.0.0-beta.37" }, "devDependencies": { + "@celo/dev-utils": "0.0.1-dev", "@celo/ganache-cli": "git+https://github.com/celo-org/ganache-cli.git#9d77e02", "@celo/protocol": "1.0.0", "@types/debug": "^4.1.5", diff --git a/packages/contractkit/src/identity/claims/account.test.ts b/packages/contractkit/src/identity/claims/account.test.ts index ca61a57e86c..699f4557821 100644 --- a/packages/contractkit/src/identity/claims/account.test.ts +++ b/packages/contractkit/src/identity/claims/account.test.ts @@ -1,8 +1,8 @@ +import { ACCOUNT_ADDRESSES, ACCOUNT_PRIVATE_KEYS } from '@celo/dev-utils/lib/ganache-setup' +import { testWithGanache } from '@celo/dev-utils/lib/ganache-test' import { privateKeyToAddress, privateKeyToPublicKey } from '@celo/utils/lib/address' import { NativeSigner } from '@celo/utils/lib/signatureUtils' import { newKitFromWeb3 } from '../../kit' -import { testWithGanache } from '../../test-utils/ganache-test' -import { ACCOUNT_ADDRESSES, ACCOUNT_PRIVATE_KEYS } from '../../test-utils/ganache.setup' import { IdentityMetadataWrapper } from '../metadata' import { createAccountClaim, MetadataURLGetter } from './account' import { SignedClaim, verifyClaim } from './claim' diff --git a/packages/contractkit/src/identity/metadata.test.ts b/packages/contractkit/src/identity/metadata.test.ts index d793cf33c07..42876bfea38 100644 --- a/packages/contractkit/src/identity/metadata.test.ts +++ b/packages/contractkit/src/identity/metadata.test.ts @@ -1,7 +1,7 @@ +import { ACCOUNT_ADDRESSES } from '@celo/dev-utils/lib/ganache-setup' +import { testWithGanache } from '@celo/dev-utils/lib/ganache-test' import { NativeSigner } from '@celo/utils/lib/signatureUtils' import { newKitFromWeb3 } from '../kit' -import { testWithGanache } from '../test-utils/ganache-test' -import { ACCOUNT_ADDRESSES } from '../test-utils/ganache.setup' import { createNameClaim } from './claims/claim' import { ClaimTypes, IdentityMetadataWrapper } from './metadata' diff --git a/packages/contractkit/src/test-utils/ganache-test.ts b/packages/contractkit/src/test-utils/ganache-test.ts deleted file mode 100644 index d1805081f8c..00000000000 --- a/packages/contractkit/src/test-utils/ganache-test.ts +++ /dev/null @@ -1,72 +0,0 @@ -import * as fs from 'fs' -import Web3 from 'web3' -import { JsonRPCResponse } from 'web3/providers' -import { injectDebugProvider } from '../providers/debug-provider' - -// This file specifies accounts available when ganache is running. These are derived -// from the MNEMONIC -export const NetworkConfig = JSON.parse( - fs.readFileSync('src/test-utils/migration-override.json').toString() -) - -export function jsonRpcCall(web3: Web3, method: string, params: any[]): Promise { - return new Promise((resolve, reject) => { - web3.currentProvider.send( - { - id: new Date().getTime(), - jsonrpc: '2.0', - method, - params, - }, - (err: Error | null, res?: JsonRPCResponse) => { - if (err) { - reject(err) - } else if (!res) { - reject(new Error('no response')) - } else if (res.error) { - reject( - new Error( - `Failed JsonRPCResponse: method: ${method} params: ${params} error: ${JSON.stringify( - res.error - )}` - ) - ) - } else { - resolve(res.result) - } - } - ) - }) -} - -export function evmRevert(web3: Web3, snapId: string): Promise { - return jsonRpcCall(web3, 'evm_revert', [snapId]) -} - -export function evmSnapshot(web3: Web3) { - return jsonRpcCall(web3, 'evm_snapshot', []) -} - -export function testWithGanache(name: string, fn: (web3: Web3) => void) { - const web3 = new Web3('http://localhost:8545') - injectDebugProvider(web3) - - describe(name, () => { - let snapId: string | null = null - - beforeEach(async () => { - if (snapId != null) { - await evmRevert(web3, snapId) - } - snapId = await evmSnapshot(web3) - }) - - afterAll(async () => { - if (snapId != null) { - await evmRevert(web3, snapId) - } - }) - - fn(web3) - }) -} diff --git a/packages/contractkit/src/test-utils/ganache.setup.ts b/packages/contractkit/src/test-utils/ganache.setup.ts index 44cbb558393..1f646b1b054 100644 --- a/packages/contractkit/src/test-utils/ganache.setup.ts +++ b/packages/contractkit/src/test-utils/ganache.setup.ts @@ -1,84 +1,8 @@ -// @ts-ignore -import * as ganache from '@celo/ganache-cli' +import baseSetup from '@celo/dev-utils/lib/ganache-setup' +// Has to import the matchers somewhere so that typescript knows the matchers have been made available +import _unused from '@celo/dev-utils/lib/matchers' import * as path from 'path' -const MNEMONIC = 'concert load couple harbor equip island argue ramp clarify fence smart topic' -export const ACCOUNT_PRIVATE_KEYS = [ - '0xf2f48ee19680706196e2e339e5da3491186e0c4c5030670656b0e0164837257d', - '0x5d862464fe9303452126c8bc94274b8c5f9874cbd219789b3eb2128075a76f72', - '0xdf02719c4df8b9b8ac7f551fcb5d9ef48fa27eef7a66453879f4d8fdc6e78fb1', - '0xff12e391b79415e941a94de3bf3a9aee577aed0731e297d5cfa0b8a1e02fa1d0', - '0x752dd9cf65e68cfaba7d60225cbdbc1f4729dd5e5507def72815ed0d8abc6249', - '0xefb595a0178eb79a8df953f87c5148402a224cdf725e88c0146727c6aceadccd', - '0x83c6d2cc5ddcf9711a6d59b417dc20eb48afd58d45290099e5987e3d768f328f', - '0xbb2d3f7c9583780a7d3904a2f55d792707c345f21de1bacb2d389934d82796b2', - '0xb2fd4d29c1390b71b8795ae81196bfd60293adf99f9d32a0aff06288fcdac55f', - '0x23cb7121166b9a2f93ae0b7c05bde02eae50d64449b2cbb42bc84e9d38d6cc89', -] -export const ACCOUNT_ADDRESSES = [ - '0x5409ED021D9299bf6814279A6A1411A7e866A631', - '0x6Ecbe1DB9EF729CBe972C83Fb886247691Fb6beb', - '0xE36Ea790bc9d7AB70C55260C66D52b1eca985f84', - '0xE834EC434DABA538cd1b9Fe1582052B880BD7e63', - '0x78dc5D2D739606d31509C31d654056A45185ECb6', - '0xA8dDa8d7F5310E4A9E24F8eBA77E091Ac264f872', - '0x06cEf8E666768cC40Cc78CF93d9611019dDcB628', - '0x4404ac8bd8F9618D27Ad2f1485AA1B2cFD82482D', - '0x7457d5E02197480Db681D3fdF256c7acA21bDc12', - '0x91c987bf62D25945dB517BDAa840A6c661374402', -] -export async function startGanache(datadir: string, opts: { verbose?: boolean } = {}) { - const logFn = opts.verbose - ? // tslint:disable-next-line: no-console - (...args: any[]) => console.log(...args) - : () => { - /*nothing*/ - } - - const server = ganache.server({ - default_balance_ether: 1000000, - logger: { - log: logFn, - }, - network_id: 1101, - db_path: datadir, - mnemonic: MNEMONIC, - gasLimit: 10000000, - allowUnlimitedContractSize: true, - }) - - await new Promise((resolve, reject) => { - server.listen(8545, (err: any, blockchain: any) => { - if (err) { - reject(err) - } else { - resolve(blockchain) - } - }) - }) - - return () => - new Promise((resolve, reject) => { - server.close((err: any) => { - if (err) { - reject(err) - } else { - resolve() - } - }) - }) -} - export default function setup() { - const DATADIR = path.resolve(path.join(__dirname, '../../.devchain')) - // console.log('Starting Ganache: datadir=', DATADIR) - return startGanache(DATADIR) - .then((stopGanache) => { - ;(global as any).stopGanache = stopGanache - }) - .catch((err) => { - console.error('Error starting ganache, Doing `yarn test:prepare` might help') - console.error(err) - process.exit(1) - }) + return baseSetup(path.resolve(path.join(__dirname, '../../.devchain'))) } diff --git a/packages/contractkit/src/test-utils/ganache.teardown.ts b/packages/contractkit/src/test-utils/ganache.teardown.ts index 27400b9a1aa..c37e9bb00a0 100644 --- a/packages/contractkit/src/test-utils/ganache.teardown.ts +++ b/packages/contractkit/src/test-utils/ganache.teardown.ts @@ -1,7 +1,2 @@ -export default function tearDown() { - console.log('Stopping ganache') - return (global as any).stopGanache().catch((err: any) => { - console.error('error stopping ganache') - console.error(err) - }) -} +import teardown from '@celo/dev-utils/lib/ganache-teardown' +export default teardown diff --git a/packages/contractkit/src/test-utils/matchers.ts b/packages/contractkit/src/test-utils/matchers.ts deleted file mode 100644 index 992831e6c95..00000000000 --- a/packages/contractkit/src/test-utils/matchers.ts +++ /dev/null @@ -1,42 +0,0 @@ -import BigNumber from 'bignumber.js' - -declare global { - namespace jest { - interface Matchers { - toBeBigNumber(): R - toEqBigNumber(expected: BigNumber | string | number): R - } - } -} - -expect.extend({ - toBeBigNumber(received: any) { - const pass = BigNumber.isBigNumber(received) - if (pass) { - return { - message: () => `expected ${received} not to be BigNumber`, - pass: true, - } - } else { - return { - message: () => `expected ${received} to be bigNumber`, - pass: false, - } - } - }, - toEqBigNumber(received: BigNumber, _expected: BigNumber | string | number) { - const expected = new BigNumber(_expected) - const pass = expected.eq(received) - if (pass) { - return { - message: () => `expected ${received.toString()} not to equal ${expected.toString()}`, - pass: true, - } - } else { - return { - message: () => `expected ${received.toString()} to equal ${expected.toString()}`, - pass: false, - } - } - }, -}) diff --git a/packages/contractkit/src/utils/signing.test.ts b/packages/contractkit/src/utils/signing.test.ts index 9940d9e1043..cb5ad282814 100644 --- a/packages/contractkit/src/utils/signing.test.ts +++ b/packages/contractkit/src/utils/signing.test.ts @@ -1,6 +1,6 @@ +import { ACCOUNT_ADDRESSES, ACCOUNT_PRIVATE_KEYS } from '@celo/dev-utils/lib/ganache-setup' +import { testWithGanache } from '@celo/dev-utils/lib/ganache-test' import { LocalSigner, NativeSigner, parseSignature } from '@celo/utils/lib/signatureUtils' -import { testWithGanache } from '../test-utils/ganache-test' -import { ACCOUNT_ADDRESSES, ACCOUNT_PRIVATE_KEYS } from '../test-utils/ganache.setup' // This only really tests signatureUtils in @celo/utils, but is tested here // to avoid the web3/ganache setup in @celo/utils diff --git a/packages/contractkit/src/utils/tx-signing.test.ts b/packages/contractkit/src/utils/tx-signing.test.ts index 072f0738ba0..b150135264a 100644 --- a/packages/contractkit/src/utils/tx-signing.test.ts +++ b/packages/contractkit/src/utils/tx-signing.test.ts @@ -1,10 +1,10 @@ +import { testWithGanache } from '@celo/dev-utils/lib/ganache-test' import debugFactory from 'debug' import * as util from 'util' import Web3 from 'web3' import { Provider } from 'web3/providers' import { generateAccountAddressFromPrivateKey } from '../providers/celo-private-keys-subprovider' import { CeloProvider } from '../providers/celo-provider' -import { testWithGanache } from '../test-utils/ganache-test' import { recoverTransaction } from './signing-utils' import { CeloTx } from './tx-signing' import { addLocalAccount } from './web3-utils' diff --git a/packages/contractkit/src/wrappers/Accounts.test.ts b/packages/contractkit/src/wrappers/Accounts.test.ts index 95bd22d4a18..caad8353fba 100644 --- a/packages/contractkit/src/wrappers/Accounts.test.ts +++ b/packages/contractkit/src/wrappers/Accounts.test.ts @@ -1,7 +1,7 @@ +import { testWithGanache } from '@celo/dev-utils/lib/ganache-test' import { addressToPublicKey, parseSignature } from '@celo/utils/lib/signatureUtils' import Web3 from 'web3' import { newKitFromWeb3 } from '../kit' -import { testWithGanache } from '../test-utils/ganache-test' import { AccountsWrapper } from './Accounts' import { LockedGoldWrapper } from './LockedGold' import { ValidatorsWrapper } from './Validators' diff --git a/packages/contractkit/src/wrappers/Exchange.test.ts b/packages/contractkit/src/wrappers/Exchange.test.ts index 3f44b1f1b6c..e1d26804f0c 100644 --- a/packages/contractkit/src/wrappers/Exchange.test.ts +++ b/packages/contractkit/src/wrappers/Exchange.test.ts @@ -1,5 +1,5 @@ +import { testWithGanache } from '@celo/dev-utils/lib/ganache-test' import { newKitFromWeb3 } from '../kit' -import { testWithGanache } from '../test-utils/ganache-test' import { ExchangeWrapper } from './Exchange' /* diff --git a/packages/contractkit/src/wrappers/GoldToken.test.ts b/packages/contractkit/src/wrappers/GoldToken.test.ts index 72486d56da1..cc6b026620a 100644 --- a/packages/contractkit/src/wrappers/GoldToken.test.ts +++ b/packages/contractkit/src/wrappers/GoldToken.test.ts @@ -1,5 +1,5 @@ +import { testWithGanache } from '@celo/dev-utils/lib/ganache-test' import { newKitFromWeb3 } from '../kit' -import { testWithGanache } from '../test-utils/ganache-test' import { GoldTokenWrapper } from './GoldTokenWrapper' testWithGanache('GoldToken Wrapper', (web3) => { diff --git a/packages/contractkit/src/wrappers/SortedOracles.test.ts b/packages/contractkit/src/wrappers/SortedOracles.test.ts index cc9cbb26e9f..e6e565fa609 100644 --- a/packages/contractkit/src/wrappers/SortedOracles.test.ts +++ b/packages/contractkit/src/wrappers/SortedOracles.test.ts @@ -1,6 +1,6 @@ +import { NetworkConfig, testWithGanache } from '@celo/dev-utils/lib/ganache-test' import { Address, CeloContract } from '../base' import { newKitFromWeb3 } from '../kit' -import { NetworkConfig, testWithGanache } from '../test-utils/ganache-test' import { OracleRate, SortedOraclesWrapper } from './SortedOracles' /* diff --git a/packages/contractkit/src/wrappers/StableToken.test.ts b/packages/contractkit/src/wrappers/StableToken.test.ts index 3525c7dbaef..ed9708b9d67 100644 --- a/packages/contractkit/src/wrappers/StableToken.test.ts +++ b/packages/contractkit/src/wrappers/StableToken.test.ts @@ -1,5 +1,5 @@ +import { testWithGanache } from '@celo/dev-utils/lib/ganache-test' import { newKitFromWeb3 } from '../kit' -import { testWithGanache } from '../test-utils/ganache-test' import { StableTokenWrapper } from './StableTokenWrapper' /* diff --git a/packages/contractkit/src/wrappers/Validators.test.ts b/packages/contractkit/src/wrappers/Validators.test.ts index e90aec9cdfe..707396de70f 100644 --- a/packages/contractkit/src/wrappers/Validators.test.ts +++ b/packages/contractkit/src/wrappers/Validators.test.ts @@ -1,8 +1,8 @@ +import { testWithGanache } from '@celo/dev-utils/lib/ganache-test' import { addressToPublicKey } from '@celo/utils/lib/signatureUtils' import BigNumber from 'bignumber.js' import Web3 from 'web3' import { newKitFromWeb3 } from '../kit' -import { testWithGanache } from '../test-utils/ganache-test' import { AccountsWrapper } from './Accounts' import { LockedGoldWrapper } from './LockedGold' import { ValidatorsWrapper } from './Validators' diff --git a/packages/dev-utils/.gitignore b/packages/dev-utils/.gitignore new file mode 100644 index 00000000000..7951405f85a --- /dev/null +++ b/packages/dev-utils/.gitignore @@ -0,0 +1 @@ +lib \ No newline at end of file diff --git a/packages/dev-utils/package.json b/packages/dev-utils/package.json new file mode 100644 index 00000000000..b74380d201e --- /dev/null +++ b/packages/dev-utils/package.json @@ -0,0 +1,28 @@ +{ + "name": "@celo/dev-utils", + "version": "0.0.1-dev", + "description": "util package for celo packages that should only be a devDependency", + "main": "./lib/index.js", + "types": "./lib/index.d.ts", + "author": "Celo", + "license": "Apache-2.0", + "homepage": "https://github.com/celo-org/celo-monorepo/tree/master/packages/dev-utils", + "repository": "https://github.com/celo-org/celo-monorepo/tree/master/packages/dev-utils", + "keywords": [ + "celo" + ], + "scripts": { + "build": "tsc -b .", + "lint": "tslint -c tslint.json --project ." + }, + "dependencies": { + "bignumber.js": "^7.2.0", + "web3": "1.0.0-beta.37" + }, + "devDependencies": { + + }, + "engines": { + "node": ">=8.13.0" + } +} diff --git a/packages/dev-utils/src/ganache-setup.ts b/packages/dev-utils/src/ganache-setup.ts new file mode 100644 index 00000000000..0e18fcd5bc5 --- /dev/null +++ b/packages/dev-utils/src/ganache-setup.ts @@ -0,0 +1,82 @@ +// @ts-ignore +import * as ganache from '@celo/ganache-cli' + +const MNEMONIC = 'concert load couple harbor equip island argue ramp clarify fence smart topic' +export const ACCOUNT_PRIVATE_KEYS = [ + '0xf2f48ee19680706196e2e339e5da3491186e0c4c5030670656b0e0164837257d', + '0x5d862464fe9303452126c8bc94274b8c5f9874cbd219789b3eb2128075a76f72', + '0xdf02719c4df8b9b8ac7f551fcb5d9ef48fa27eef7a66453879f4d8fdc6e78fb1', + '0xff12e391b79415e941a94de3bf3a9aee577aed0731e297d5cfa0b8a1e02fa1d0', + '0x752dd9cf65e68cfaba7d60225cbdbc1f4729dd5e5507def72815ed0d8abc6249', + '0xefb595a0178eb79a8df953f87c5148402a224cdf725e88c0146727c6aceadccd', + '0x83c6d2cc5ddcf9711a6d59b417dc20eb48afd58d45290099e5987e3d768f328f', + '0xbb2d3f7c9583780a7d3904a2f55d792707c345f21de1bacb2d389934d82796b2', + '0xb2fd4d29c1390b71b8795ae81196bfd60293adf99f9d32a0aff06288fcdac55f', + '0x23cb7121166b9a2f93ae0b7c05bde02eae50d64449b2cbb42bc84e9d38d6cc89', +] +export const ACCOUNT_ADDRESSES = [ + '0x5409ED021D9299bf6814279A6A1411A7e866A631', + '0x6Ecbe1DB9EF729CBe972C83Fb886247691Fb6beb', + '0xE36Ea790bc9d7AB70C55260C66D52b1eca985f84', + '0xE834EC434DABA538cd1b9Fe1582052B880BD7e63', + '0x78dc5D2D739606d31509C31d654056A45185ECb6', + '0xA8dDa8d7F5310E4A9E24F8eBA77E091Ac264f872', + '0x06cEf8E666768cC40Cc78CF93d9611019dDcB628', + '0x4404ac8bd8F9618D27Ad2f1485AA1B2cFD82482D', + '0x7457d5E02197480Db681D3fdF256c7acA21bDc12', + '0x91c987bf62D25945dB517BDAa840A6c661374402', +] + +export async function startGanache(datadir: string, opts: { verbose?: boolean } = {}) { + const logFn = opts.verbose + ? // tslint:disable-next-line: no-console + (...args: any[]) => console.log(...args) + : () => { + /*nothing*/ + } + + const server = ganache.server({ + default_balance_ether: 1000000, + logger: { + log: logFn, + }, + network_id: 1101, + db_path: datadir, + mnemonic: MNEMONIC, + gasLimit: 10000000, + allowUnlimitedContractSize: true, + }) + + await new Promise((resolve, reject) => { + server.listen(8545, (err: any, blockchain: any) => { + if (err) { + reject(err) + } else { + resolve(blockchain) + } + }) + }) + + return () => + new Promise((resolve, reject) => { + server.close((err: any) => { + if (err) { + reject(err) + } else { + resolve() + } + }) + }) +} + +export default function setup(dataDir: string) { + return startGanache(dataDir) + .then((stopGanache) => { + ;(global as any).stopGanache = stopGanache + }) + .catch((err) => { + console.error('Error starting ganache, Doing `yarn test:prepare` might help') + console.error(err) + process.exit(1) + }) +} diff --git a/packages/dev-utils/src/ganache-teardown.ts b/packages/dev-utils/src/ganache-teardown.ts new file mode 100644 index 00000000000..27400b9a1aa --- /dev/null +++ b/packages/dev-utils/src/ganache-teardown.ts @@ -0,0 +1,7 @@ +export default function tearDown() { + console.log('Stopping ganache') + return (global as any).stopGanache().catch((err: any) => { + console.error('error stopping ganache') + console.error(err) + }) +} diff --git a/packages/cli/src/test-utils/ganache-test.ts b/packages/dev-utils/src/ganache-test.ts similarity index 93% rename from packages/cli/src/test-utils/ganache-test.ts rename to packages/dev-utils/src/ganache-test.ts index 6581e91d652..f61174654e6 100644 --- a/packages/cli/src/test-utils/ganache-test.ts +++ b/packages/dev-utils/src/ganache-test.ts @@ -1,5 +1,8 @@ import Web3 from 'web3' import { JsonRPCResponse } from 'web3/providers' +import migrationOverride from './migration-override.json' + +export const NetworkConfig = migrationOverride export function jsonRpcCall(web3: Web3, method: string, params: any[]): Promise { return new Promise((resolve, reject) => { diff --git a/packages/cli/src/test-utils/matchers.ts b/packages/dev-utils/src/matchers.ts similarity index 100% rename from packages/cli/src/test-utils/matchers.ts rename to packages/dev-utils/src/matchers.ts diff --git a/packages/contractkit/src/test-utils/migration-override.json b/packages/dev-utils/src/migration-override.json similarity index 100% rename from packages/contractkit/src/test-utils/migration-override.json rename to packages/dev-utils/src/migration-override.json diff --git a/packages/dev-utils/tsconfig.json b/packages/dev-utils/tsconfig.json new file mode 100644 index 00000000000..e3749ab6cf6 --- /dev/null +++ b/packages/dev-utils/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../typescript/tsconfig.library.json", + "compilerOptions": { + "rootDir": "src", + "outDir": "lib", + "resolveJsonModule": true + }, + "include": ["src", "types/", "src/migration-override.json"] +} diff --git a/packages/dev-utils/tslint.json b/packages/dev-utils/tslint.json new file mode 100644 index 00000000000..036f000683b --- /dev/null +++ b/packages/dev-utils/tslint.json @@ -0,0 +1,9 @@ +{ + "extends": ["@celo/typescript/tslint.json"], + "rules": { + "no-global-arrow-functions": false, + "no-console": false, + "member-ordering": false, + "max-classes-per-file": false + } +} From e8429db84a29f48e1e1f290ba3218e6ee491d311 Mon Sep 17 00:00:00 2001 From: Nam Chu Hoai Date: Mon, 18 Nov 2019 10:05:43 -0800 Subject: [PATCH 13/61] Support Twilio in the attestation service (#1754) --- .../config/.env.development | 6 ++- packages/attestation-service/package.json | 1 + .../attestation-service/src/attestation.ts | 12 ++--- .../src/models/attestation.ts | 8 ---- packages/attestation-service/src/sms/base.ts | 1 + packages/attestation-service/src/sms/index.ts | 14 ++++-- .../attestation-service/src/sms/twilio.ts | 48 +++++++++++++++++++ 7 files changed, 68 insertions(+), 22 deletions(-) create mode 100644 packages/attestation-service/src/sms/twilio.ts diff --git a/packages/attestation-service/config/.env.development b/packages/attestation-service/config/.env.development index e5d83040ec2..ef15b10adb5 100644 --- a/packages/attestation-service/config/.env.development +++ b/packages/attestation-service/config/.env.development @@ -3,7 +3,11 @@ CELO_PROVIDER=https://integration-forno.celo-testnet.org ACCOUNT_ADDRESS=0xE6e53b5fc2e18F51781f14a3ce5E7FD468247a15 ATTESTATION_KEY=x APP_SIGNATURE=x -SMS_PROVIDERS=nexmo +SMS_PROVIDERS=twilio,nexmo NEXMO_KEY=x NEXMO_SECRET=x NEXMO_BLACKLIST= +TWILIO_ACCOUNT_SID=x +TWILIO_MESSAGING_SERVICE_SID=x +TWILIO_AUTH_TOKEN=x +TWILIO_BLACKLIST= diff --git a/packages/attestation-service/package.json b/packages/attestation-service/package.json index d5bf54f11cd..0d69eb01d3b 100644 --- a/packages/attestation-service/package.json +++ b/packages/attestation-service/package.json @@ -45,6 +45,7 @@ "sequelize": "5.13.1", "sequelize-cli": "5.5.0", "sqlite3": "4.0.9", + "twilio": "^3.23.2", "yargs": "13.3.0" }, "devDependencies": { diff --git a/packages/attestation-service/src/attestation.ts b/packages/attestation-service/src/attestation.ts index 42a2b651e77..4e78b14a0b7 100644 --- a/packages/attestation-service/src/attestation.ts +++ b/packages/attestation-service/src/attestation.ts @@ -1,11 +1,6 @@ import { AttestationState } from '@celo/contractkit/lib/wrappers/Attestations' import { attestToIdentifier, SignatureUtils } from '@celo/utils' -import { - Address, - isValidPrivateKey, - privateKeyToAddress, - toChecksumAddress, -} from '@celo/utils/lib/address' +import { Address, isValidPrivateKey, toChecksumAddress } from '@celo/utils/lib/address' import { AddressType, E164Number, E164PhoneNumberType } from '@celo/utils/lib/io' import { isValidAddress } from 'ethereumjs-util' import express from 'express' @@ -60,7 +55,6 @@ async function validateAttestationRequest(request: AttestationRequest) { ) // check if it exists in the database if (attestationRecord && !attestationRecord.canSendSms()) { - console.log(attestationRecord.canSendSms()) throw new Error(ATTESTATION_ALREADY_SENT_ERROR) } const address = getAccountAddress() @@ -89,8 +83,7 @@ async function validateAttestation( attestationRequest: AttestationRequest, attestationCode: string ) { - const key = getAttestationKey() - const address = privateKeyToAddress(key) + const address = getAccountAddress() const attestations = await kit.contracts.getAttestations() const isValid = await attestations.validateAttestationCode( attestationRequest.phoneNumber, @@ -187,6 +180,7 @@ async function sendSmsAndPersistAttestation( { transaction } ) } catch (error) { + console.error(error) await attestationRecord.update( { status: AttestationStatus.FAILED, smsProvider: provider.type }, { transaction } diff --git a/packages/attestation-service/src/models/attestation.ts b/packages/attestation-service/src/models/attestation.ts index 24e24e7d092..9ae3110cdfe 100644 --- a/packages/attestation-service/src/models/attestation.ts +++ b/packages/attestation-service/src/models/attestation.ts @@ -33,14 +33,6 @@ export default (sequelize: Sequelize) => { }) as AttestationStatic model.prototype.canSendSms = function() { - console.log( - this.status, - [ - AttestationStatus.DISPATCHING, - AttestationStatus.FAILED, - AttestationStatus.UNABLE_TO_SERVE, - ].includes(this.status) - ) return [ AttestationStatus.DISPATCHING, AttestationStatus.FAILED, diff --git a/packages/attestation-service/src/sms/base.ts b/packages/attestation-service/src/sms/base.ts index 326aa1c6900..aa5ad1517c5 100644 --- a/packages/attestation-service/src/sms/base.ts +++ b/packages/attestation-service/src/sms/base.ts @@ -17,4 +17,5 @@ export abstract class SmsProvider { export enum SmsProviderType { NEXMO = 'nexmo', UNKNOWN = 'unknown', + TWILIO = 'twilio', } diff --git a/packages/attestation-service/src/sms/index.ts b/packages/attestation-service/src/sms/index.ts index 58c6a701e03..f6a1de0cfd9 100644 --- a/packages/attestation-service/src/sms/index.ts +++ b/packages/attestation-service/src/sms/index.ts @@ -2,6 +2,7 @@ import { E164Number } from '@celo/utils/lib/io' import { fetchEnv } from '../env' import { SmsProvider, SmsProviderType } from './base' import { NexmoSmsProvider } from './nexmo' +import { TwilioSmsProvider } from './twilio' const smsProviders: SmsProvider[] = [] @@ -17,12 +18,17 @@ export async function initializeSmsProviders() { for (const configuredSmsProvider of configuredSmsProviders) { switch (configuredSmsProvider) { case SmsProviderType.NEXMO: - const provider = NexmoSmsProvider.fromEnv() - await provider.initialize() - smsProviders.push(provider) + const nexmoProvider = NexmoSmsProvider.fromEnv() + await nexmoProvider.initialize() + smsProviders.push(nexmoProvider) break - default: + case SmsProviderType.TWILIO: + const twilioProvider = TwilioSmsProvider.fromEnv() + await twilioProvider.initialize() + smsProviders.push(twilioProvider) break + default: + throw new Error(`Unknown sms provider type specified: ${configuredSmsProvider}`) } } } diff --git a/packages/attestation-service/src/sms/twilio.ts b/packages/attestation-service/src/sms/twilio.ts new file mode 100644 index 00000000000..2db0f986fb3 --- /dev/null +++ b/packages/attestation-service/src/sms/twilio.ts @@ -0,0 +1,48 @@ +import twilio, { Twilio } from 'twilio' +import { fetchEnv } from '../env' +import { SmsProvider, SmsProviderType } from './base' + +export class TwilioSmsProvider extends SmsProvider { + static fromEnv() { + return new TwilioSmsProvider( + fetchEnv('TWILIO_ACCOUNT_SID'), + fetchEnv('TWILIO_MESSAGING_SERVICE_SID'), + fetchEnv('TWILIO_AUTH_TOKEN'), + fetchEnv('TWILIO_BLACKLIST').split(',') + ) + } + + client: Twilio + messagingServiceSid: string + type = SmsProviderType.TWILIO + + constructor( + twilioSid: string, + messagingServiceSid: string, + twilioAuthToken: string, + blacklistedRegionCodes: string[] + ) { + super() + this.client = twilio(twilioSid, twilioAuthToken) + this.messagingServiceSid = messagingServiceSid + this.blacklistedRegionCodes = blacklistedRegionCodes + } + + async initialize() { + // Ensure the messaging service exists + try { + await this.client.messaging.services.get(this.messagingServiceSid).fetch() + } catch (error) { + throw new Error(`Twilio Messaging Service could not be fetched: ${error}`) + } + } + + async sendSms(phoneNumber: string, message: string) { + await this.client.messages.create({ + body: message, + to: phoneNumber, + from: this.messagingServiceSid, + }) + return + } +} From 98a82dca4c7c2248e3e92b527431ba0b0ef2416d Mon Sep 17 00:00:00 2001 From: Tim Moreton Date: Mon, 18 Nov 2019 13:32:07 -0800 Subject: [PATCH 14/61] Factor out intrinsic gas values --- .../celotool/src/e2e-tests/transfer_tests.ts | 21 ++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/packages/celotool/src/e2e-tests/transfer_tests.ts b/packages/celotool/src/e2e-tests/transfer_tests.ts index f179602c17d..0bbef5f1ec8 100644 --- a/packages/celotool/src/e2e-tests/transfer_tests.ts +++ b/packages/celotool/src/e2e-tests/transfer_tests.ts @@ -79,6 +79,12 @@ const setIntrinsicGas = async (validatorUri: string, validatorAddress: string, g .sendAndWaitForReceipt({ from: validatorAddress }) } +// Intrinsic gas for a basic transaction +const INTRINSIC_GAS_FOR_TX = 21000 + +// Additional intrinsic gas for a transaction with gas currency specified +const ADDITIONAL_INTRINSIC_TX_GAS_COST = 134000 + /** Helper to watch balance changes over accounts */ interface BalanceWatcher { update(): Promise @@ -520,7 +526,8 @@ describe('Transfer tests', function(this: any) { }) describe('gasCurrency = CeloDollars >', () => { - const intrinsicGas = 155000 + const intrinsicGas = INTRINSIC_GAS_FOR_TX + ADDITIONAL_INTRINSIC_TX_GAS_COST + describe('when there is no demurrage', () => { describe('when setting a gas amount greater than the amount of gas necessary', () => testTransferToken({ @@ -579,7 +586,7 @@ describe('Transfer tests', function(this: any) { }) describe('Transfer with changed intrinsic gas cost >', () => { - const intrinsicGasForAlternativeGasCurrency = 34000 + const changedIntrinsicGasForAlternativeGasCurrency = 34000 before(restartWithCleanNodes) @@ -588,7 +595,11 @@ describe('Transfer tests', function(this: any) { before(`start geth on sync: ${syncMode}`, async () => { try { await startSyncNode(syncMode) - await setIntrinsicGas('http://localhost:8545', validatorAddress, 34000) + await setIntrinsicGas( + 'http://localhost:8545', + validatorAddress, + changedIntrinsicGasForAlternativeGasCurrency + ) } catch (err) { console.debug('some error', err) } @@ -596,11 +607,11 @@ describe('Transfer tests', function(this: any) { describe('Transfer CeloGold >', () => { describe('gasCurrency = CeloDollars >', () => { - const intrinsicGas = intrinsicGasForAlternativeGasCurrency + 21000 + const intrinsicGas = changedIntrinsicGasForAlternativeGasCurrency + INTRINSIC_GAS_FOR_TX describe('when there is no demurrage', () => { describe('when setting a gas amount greater than the amount of gas necessary', () => testTransferToken({ - expectedGas: 55000, + expectedGas: intrinsicGas, transferToken: CeloContract.GoldToken, feeToken: CeloContract.StableToken, txOptions: { From 6d7d5ba619cdee14b72647e4269625569d4654e5 Mon Sep 17 00:00:00 2001 From: Tim Moreton Date: Mon, 18 Nov 2019 14:06:03 -0800 Subject: [PATCH 15/61] Switch e2e tests back to master --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index b305ba4af9d..1fb036756d5 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -36,7 +36,7 @@ e2e-defaults: &e2e-defaults docker: - image: celohq/circleci environment: - CELO_BLOCKCHAIN_BRANCH_TO_TEST: timmoreton/free-tobin-tax + CELO_BLOCKCHAIN_BRANCH_TO_TEST: master general: artifacts: From c0a5d94f5ceb46523340c815dbd5aa6a73e00b2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=ADn=20Volpe?= Date: Tue, 19 Nov 2019 00:15:28 +0100 Subject: [PATCH 16/61] [wallet] UX fixes for native phone number (#1717) --- .../components/PhoneNumberInput.test.tsx | 93 ++++++++++++++++++- .../components/PhoneNumberInput.tsx | 62 +++++++------ 2 files changed, 127 insertions(+), 28 deletions(-) diff --git a/packages/react-components/components/PhoneNumberInput.test.tsx b/packages/react-components/components/PhoneNumberInput.test.tsx index 97a8872544f..9c7412ed0d9 100644 --- a/packages/react-components/components/PhoneNumberInput.test.tsx +++ b/packages/react-components/components/PhoneNumberInput.test.tsx @@ -4,6 +4,8 @@ import * as React from 'react' import { Platform } from 'react-native' import { fireEvent, render } from 'react-native-testing-library' +const testNumber = '123' + jest.mock('@celo/react-native-sms-retriever', () => { return { requestPhoneNumber: jest.fn(() => '+49030111111'), @@ -63,8 +65,6 @@ describe('when defaultCountry is truthy', () => { wrapper.instance().setState({}) await wrapper.instance().triggerPhoneNumberRequest() - // expect(wrapper.find(ValidatedTextInput).props().value).toEqual('030 111111') - expect( wrapper.findWhere((node) => node.prop('testID') === 'PhoneNumberField').props().value ).toBe('030 111111') @@ -78,4 +78,93 @@ describe('when defaultCountry is truthy', () => { ).toBe('Germany') }) }) + + it("Don't trigger Native phone picker if there's data in the form", async () => { + // mock + Platform.OS = 'android' + + const wrapper = shallow( + + ) + + wrapper.instance().setState({ phoneNumber: testNumber }) + // await wrapper.instance().triggerPhoneNumberRequest() + wrapper.findWhere((node) => node.prop('testID') === 'PhoneNumberField').simulate('focus') + + expect( + wrapper.findWhere((node) => node.prop('testID') === 'PhoneNumberField').props().value + ).toBe(testNumber) + expect(wrapper.instance().state.countryCallingCode).toEqual('') + + expect( + wrapper.findWhere((node) => node.prop('testID') === 'contryCodeText').props().children + ).toBe('') + expect( + wrapper.findWhere((node) => node.prop('testID') === 'CountryNameField').props().defaultValue + ).toBe('') + }) + + it('can read Canada phone', async () => { + // mock + Platform.OS = 'android' + const wrapper = shallow( + + ) + + wrapper.instance().getPhoneNumberFromNativePickerAndroid = jest.fn( + async () => '+1 416-868-0000' + ) + + wrapper.instance().setState({}) + await wrapper.instance().triggerPhoneNumberRequest() + + expect( + wrapper.findWhere((node) => node.prop('testID') === 'PhoneNumberField').props().value + ).toBe('(416) 868-0000') + expect(wrapper.instance().state.countryCallingCode).toEqual('+1') + expect( + wrapper.findWhere((node) => node.prop('testID') === 'contryCodeText').props().children + ).toBe('+1') + expect( + wrapper.findWhere((node) => node.prop('testID') === 'CountryNameField').props().defaultValue + ).toBe('Canada') + }) + + it('can read US phone', async () => { + // mock + Platform.OS = 'android' + const wrapper = shallow( + + ) + + wrapper.instance().getPhoneNumberFromNativePickerAndroid = jest.fn( + async () => '+1 415-426-5200' + ) + + wrapper.instance().setState({}) + await wrapper.instance().triggerPhoneNumberRequest() + + expect( + wrapper.findWhere((node) => node.prop('testID') === 'PhoneNumberField').props().value + ).toBe('(415) 426-5200') + expect(wrapper.instance().state.countryCallingCode).toEqual('+1') + expect( + wrapper.findWhere((node) => node.prop('testID') === 'contryCodeText').props().children + ).toBe('+1') + expect( + wrapper.findWhere((node) => node.prop('testID') === 'CountryNameField').props().defaultValue + ).toBe('USA') + }) }) diff --git a/packages/react-components/components/PhoneNumberInput.tsx b/packages/react-components/components/PhoneNumberInput.tsx index 83d46965e93..e36498a5078 100644 --- a/packages/react-components/components/PhoneNumberInput.tsx +++ b/packages/react-components/components/PhoneNumberInput.tsx @@ -53,7 +53,7 @@ export default class PhoneNumberInput extends React.Component { componentDidMount() { if (this.props.defaultCountry) { - this.onChangeCountryQuery(this.props.defaultCountry) + this.changeCountryQuery(this.props.defaultCountry) } if (this.props.defaultCountryCode) { @@ -61,7 +61,7 @@ export default class PhoneNumberInput extends React.Component { this.props.defaultCountryCode ) - this.onChangeCountryQuery(country.displayName) + this.changeCountryQuery(country.displayName) } if (this.props.defaultPhoneNumber) { @@ -69,40 +69,47 @@ export default class PhoneNumberInput extends React.Component { } } - async triggerPhoneNumberRequestAndroid() { + async getPhoneNumberFromNativePickerAndroid() { try { - const phone = await SmsRetriever.requestPhoneNumber() - const phoneNumber = parsePhoneNumber(phone, '') - - if (!phoneNumber) { + try { + return SmsRetriever.requestPhoneNumber() + } catch (error) { + console.info( + `${TAG}/triggerPhoneNumberRequestAndroid`, + 'Could not request phone. This might be thrown if the user dismissed the modal', + error + ) return } - - this.setState({ phoneNumber: phoneNumber.displayNumber.toString() }) - - if (phoneNumber.countryCode) { - // TODO known issue, the country code is not enough to - // get a country, e.g. +1 could be USA or Canada - const displayName = this.state.countries.getCountryByPhoneCountryCode( - '+' + phoneNumber.countryCode.toString() - ).displayName - - this.onChangeCountryQuery(displayName) - } } catch (error) { - console.error(`${TAG}/triggerPhoneNumberRequestAndroid`, 'Could not request phone', error) + console.info(`${TAG}/triggerPhoneNumberRequestAndroid`, 'Could not request phone', error) } } async triggerPhoneNumberRequest() { + let phone try { if (Platform.OS === 'android') { - await this.triggerPhoneNumberRequestAndroid() + phone = await this.getPhoneNumberFromNativePickerAndroid() } else { console.info(`${TAG}/triggerPhoneNumberRequest`, 'Not implemented in this platform') } + const phoneNumber = parsePhoneNumber(phone, '') + if (!phoneNumber) { + return + } + this.setState({ phoneNumber: phoneNumber.displayNumber.toString() }) + + // A country code is not enough to know the country of a phone number (e.g. both the US and Canada share the +1) + // To get the country a Region Code is required, a two-letter country/region identifier (ISO-3166-1 Alpha2) + const regionCode = phoneNumber.regionCode + + if (regionCode) { + const displayName = this.state.countries.getCountryByCode(regionCode).displayName + this.changeCountryQuery(displayName) + } } catch (error) { - console.error(`${TAG}/triggerPhoneNumberRequest`, 'Could not request phone', error) + console.info(`${TAG}/triggerPhoneNumberRequest`, 'Could not request phone', error) } } @@ -110,10 +117,13 @@ export default class PhoneNumberInput extends React.Component { if (this.props.onInputFocus) { await this.props.onInputFocus() } - await this.triggerPhoneNumberRequest() + + if (!(this.state.phoneNumber || this.state.countryQuery)) { + return this.triggerPhoneNumberRequest() + } } - onChangeCountryQuery = (countryQuery: string) => { + changeCountryQuery = (countryQuery: string) => { if (this.props.onInputChange) { this.props.onInputChange() } @@ -180,7 +190,7 @@ export default class PhoneNumberInput extends React.Component { const { displayName, emoji, countryCallingCodes } = this.state.countries.getCountryByCode( countryCode ) - const onPress = () => this.onChangeCountryQuery(displayName) + const onPress = () => this.changeCountryQuery(displayName) return ( @@ -230,7 +240,7 @@ export default class PhoneNumberInput extends React.Component { data={filteredCountries} keyExtractor={this.keyExtractor} defaultValue={countryQuery} - onChangeText={this.onChangeCountryQuery} + onChangeText={this.changeCountryQuery} onEndEditing={this.props.onEndEditingCountryCode} placeholder={this.props.inputCountryPlaceholder} renderItem={this.renderItem} From 254b76505af0ee1c24925b46b65e47a19b8abc3c Mon Sep 17 00:00:00 2001 From: Nam Chu Hoai Date: Mon, 18 Nov 2019 18:37:22 -0800 Subject: [PATCH 17/61] Add attestation service status endpoint (#1761) * Add status endpoint * Fix lint * Allow optional proof of posession for the attestation key * Extract blacklist parsing * Create catchAsyncErrorHandler --- packages/attestation-service/package.json | 2 + packages/attestation-service/src/env.ts | 4 ++ packages/attestation-service/src/index.ts | 16 +++++- packages/attestation-service/src/request.ts | 30 +++++++--- .../src/{ => requestHandlers}/attestation.ts | 10 ++-- .../src/requestHandlers/status.ts | 55 +++++++++++++++++++ packages/attestation-service/src/sms/base.ts | 7 +++ packages/attestation-service/src/sms/index.ts | 15 ++++- packages/attestation-service/src/sms/nexmo.ts | 4 +- .../attestation-service/src/sms/twilio.ts | 4 +- packages/utils/src/collections.ts | 17 ++++++ packages/utils/src/io.ts | 2 + yarn.lock | 13 +++++ 13 files changed, 156 insertions(+), 23 deletions(-) rename packages/attestation-service/src/{ => requestHandlers}/attestation.ts (96%) create mode 100644 packages/attestation-service/src/requestHandlers/status.ts diff --git a/packages/attestation-service/package.json b/packages/attestation-service/package.json index 0d69eb01d3b..e82ad710aaa 100644 --- a/packages/attestation-service/package.json +++ b/packages/attestation-service/package.json @@ -39,6 +39,7 @@ "nexmo": "2.4.2", "web3": "1.0.0-beta.37", "express": "4.17.1", + "express-rate-limit": "5.0.0", "mysql2": "2.0.0-alpha1", "pg": "7.12.1", "pg-hstore": "2.3.3", @@ -52,6 +53,7 @@ "@celo/protocol": "1.0.0", "@types/dotenv": "4.0.3", "@types/debug": "^4.1.5", + "@types/express-rate-limit": "2.9.3", "@types/web3": "^1.0.18", "ts-node": "8.3.0", "nodemon": "1.19.1", diff --git a/packages/attestation-service/src/env.ts b/packages/attestation-service/src/env.ts index 349ffa1a074..adcc44f32b2 100644 --- a/packages/attestation-service/src/env.ts +++ b/packages/attestation-service/src/env.ts @@ -5,3 +5,7 @@ export function fetchEnv(name: string): string { } return process.env[name] as string } + +export function fetchEnvOrDefault(name: string, defaultValue: string): string { + return process.env[name] === undefined ? defaultValue : (process.env[name] as string) +} diff --git a/packages/attestation-service/src/index.ts b/packages/attestation-service/src/index.ts index 38cce839c13..8198c4192a0 100644 --- a/packages/attestation-service/src/index.ts +++ b/packages/attestation-service/src/index.ts @@ -1,10 +1,15 @@ import * as dotenv from 'dotenv' import express from 'express' -import { AttestationRequestType, getAttestationKey, handleAttestationRequest } from './attestation' +import RateLimiter from 'express-rate-limit' import { initializeDB, initializeKit } from './db' import { createValidatedHandler } from './request' +import { + AttestationRequestType, + getAttestationKey, + handleAttestationRequest, +} from './requestHandlers/attestation' +import { handleStatusRequest, StatusRequestType } from './requestHandlers/status' import { initializeSmsProviders } from './sms' - async function init() { console.info(process.env.CONFIG) if (process.env.CONFIG) { @@ -22,6 +27,13 @@ async function init() { const port = process.env.PORT || 3000 app.listen(port, () => console.log(`Server running on ${port}!`)) + const rateLimiter = new RateLimiter({ + windowMs: 5 * 60 * 100, // 5 minutes + max: 50, + // @ts-ignore + message: { status: false, error: 'Too many requests, please try again later' }, + }) + app.get('/status', rateLimiter, createValidatedHandler(StatusRequestType, handleStatusRequest)) app.post( '/attestations', createValidatedHandler(AttestationRequestType, handleAttestationRequest) diff --git a/packages/attestation-service/src/request.ts b/packages/attestation-service/src/request.ts index ea46ee6f515..82a2f6b7825 100644 --- a/packages/attestation-service/src/request.ts +++ b/packages/attestation-service/src/request.ts @@ -2,12 +2,29 @@ import express from 'express' import { isLeft } from 'fp-ts/lib/Either' import * as t from 'io-ts' +export enum ErrorMessages { + UNKNOWN_ERROR = 'Something went wrong', +} + +export function catchAsyncErrorHandler( + handler: (req: express.Request, res: express.Response) => Promise +) { + return async (req: express.Request, res: express.Response) => { + try { + return handler(req, res) + } catch (error) { + console.error(error) + respondWithError(res, 500, ErrorMessages.UNKNOWN_ERROR) + } + } +} + export function createValidatedHandler( requestType: t.Type, handler: (req: express.Request, res: express.Response, parsedRequest: T) => Promise ) { - return async (req: express.Request, res: express.Response) => { - const parsedRequest = requestType.decode(req.body) + return catchAsyncErrorHandler(async (req: express.Request, res: express.Response) => { + const parsedRequest = requestType.decode({ ...req.query, ...req.body }) if (isLeft(parsedRequest)) { res.status(422).json({ success: false, @@ -15,14 +32,9 @@ export function createValidatedHandler( errors: serializeErrors(parsedRequest.left), }) } else { - try { - await handler(req, res, parsedRequest.right) - } catch (error) { - console.error(error) - res.status(500).json({ success: false, error: 'Something went wrong' }) - } + return handler(req, res, parsedRequest.right) } - } + }) } function serializeErrors(errors: t.Errors) { diff --git a/packages/attestation-service/src/attestation.ts b/packages/attestation-service/src/requestHandlers/attestation.ts similarity index 96% rename from packages/attestation-service/src/attestation.ts rename to packages/attestation-service/src/requestHandlers/attestation.ts index 4e78b14a0b7..b0f7bf54b37 100644 --- a/packages/attestation-service/src/attestation.ts +++ b/packages/attestation-service/src/requestHandlers/attestation.ts @@ -6,11 +6,11 @@ import { isValidAddress } from 'ethereumjs-util' import express from 'express' import * as t from 'io-ts' import { Transaction } from 'sequelize' -import { existingAttestationRequestRecord, getAttestationTable, kit, sequelize } from './db' -import { AttestationModel, AttestationStatus } from './models/attestation' -import { respondWithError } from './request' -import { smsProviderFor } from './sms' -import { SmsProviderType } from './sms/base' +import { existingAttestationRequestRecord, getAttestationTable, kit, sequelize } from '../db' +import { AttestationModel, AttestationStatus } from '../models/attestation' +import { respondWithError } from '../request' +import { smsProviderFor } from '../sms' +import { SmsProviderType } from '../sms/base' const SMS_SENDING_ERROR = 'Something went wrong while attempting to send SMS, try again later' const ATTESTATION_ERROR = 'Valid attestation could not be provided' diff --git a/packages/attestation-service/src/requestHandlers/status.ts b/packages/attestation-service/src/requestHandlers/status.ts new file mode 100644 index 00000000000..3866e31a1db --- /dev/null +++ b/packages/attestation-service/src/requestHandlers/status.ts @@ -0,0 +1,55 @@ +import { privateKeyToAddress } from '@celo/utils/lib/address' +import { AddressType, SignatureType } from '@celo/utils/lib/io' +import { serializeSignature, signMessage } from '@celo/utils/lib/signatureUtils' +import express from 'express' +import * as t from 'io-ts' +import { ErrorMessages, respondWithError } from '../request' +import { blacklistRegionCodes, configuredSmsProviders } from '../sms' +import { getAccountAddress, getAttestationKey } from './attestation' + +export const SIGNATURE_PREFIX = 'attestation-service-status-signature:' +export const StatusRequestType = t.type({ + messageToSign: t.union([SignatureType, t.undefined]), +}) + +export const StatusResponseType = t.type({ + status: t.literal('ok'), + smsProviders: t.array(t.string), + blacklistedRegionCodes: t.array(t.string), + accountAddress: AddressType, + signature: t.union([SignatureType, t.undefined]), +}) + +export type StatusRequest = t.TypeOf + +function produceSignature(message: string | undefined) { + if (!message) { + return undefined + } + const key = getAttestationKey() + const address = privateKeyToAddress(key) + return serializeSignature(signMessage(SIGNATURE_PREFIX + message, key, address)) +} + +export async function handleStatusRequest( + _req: express.Request, + res: express.Response, + statusRequest: StatusRequest +) { + try { + res + .json( + StatusResponseType.encode({ + status: 'ok', + smsProviders: configuredSmsProviders(), + blacklistedRegionCodes: blacklistRegionCodes(), + accountAddress: getAccountAddress(), + signature: produceSignature(statusRequest.messageToSign), + }) + ) + .status(200) + } catch (error) { + console.error(error) + respondWithError(res, 500, ErrorMessages.UNKNOWN_ERROR) + } +} diff --git a/packages/attestation-service/src/sms/base.ts b/packages/attestation-service/src/sms/base.ts index aa5ad1517c5..755d9762d6f 100644 --- a/packages/attestation-service/src/sms/base.ts +++ b/packages/attestation-service/src/sms/base.ts @@ -1,5 +1,6 @@ import { E164Number } from '@celo/utils/lib/io' import { PhoneNumberUtil } from 'google-libphonenumber' +import { fetchEnvOrDefault } from '../env' const phoneUtil = PhoneNumberUtil.getInstance() export abstract class SmsProvider { @@ -19,3 +20,9 @@ export enum SmsProviderType { UNKNOWN = 'unknown', TWILIO = 'twilio', } + +export function readBlacklistFromEnv(envVarName: string) { + return fetchEnvOrDefault(envVarName, '') + .split(',') + .filter((code) => code !== '') +} diff --git a/packages/attestation-service/src/sms/index.ts b/packages/attestation-service/src/sms/index.ts index f6a1de0cfd9..ff77fa708af 100644 --- a/packages/attestation-service/src/sms/index.ts +++ b/packages/attestation-service/src/sms/index.ts @@ -1,3 +1,4 @@ +import { intersection } from '@celo/utils/lib/collections' import { E164Number } from '@celo/utils/lib/io' import { fetchEnv } from '../env' import { SmsProvider, SmsProviderType } from './base' @@ -7,15 +8,15 @@ import { TwilioSmsProvider } from './twilio' const smsProviders: SmsProvider[] = [] export async function initializeSmsProviders() { - const configuredSmsProviders = fetchEnv('SMS_PROVIDERS').split(',') as Array< + const smsProvidersToConfigure = fetchEnv('SMS_PROVIDERS').split(',') as Array< SmsProviderType | string > - if (configuredSmsProviders.length === 0) { + if (smsProvidersToConfigure.length === 0) { throw new Error('You have to specify at least one sms provider') } - for (const configuredSmsProvider of configuredSmsProviders) { + for (const configuredSmsProvider of smsProvidersToConfigure) { switch (configuredSmsProvider) { case SmsProviderType.NEXMO: const nexmoProvider = NexmoSmsProvider.fromEnv() @@ -36,3 +37,11 @@ export async function initializeSmsProviders() { export function smsProviderFor(phoneNumber: E164Number) { return smsProviders.find((provider) => provider.canServePhoneNumber(phoneNumber)) } + +export function configuredSmsProviders() { + return smsProviders.map((provider) => provider.type) +} + +export function blacklistRegionCodes() { + return intersection(smsProviders.map((provider) => provider.blacklistedRegionCodes)) +} diff --git a/packages/attestation-service/src/sms/nexmo.ts b/packages/attestation-service/src/sms/nexmo.ts index 90d4107a898..cb126881c1e 100644 --- a/packages/attestation-service/src/sms/nexmo.ts +++ b/packages/attestation-service/src/sms/nexmo.ts @@ -3,7 +3,7 @@ import { E164Number } from '@celo/utils/lib/io' import { PhoneNumberUtil } from 'google-libphonenumber' import Nexmo from 'nexmo' import { fetchEnv } from '../env' -import { SmsProvider, SmsProviderType } from './base' +import { readBlacklistFromEnv, SmsProvider, SmsProviderType } from './base' const phoneUtil = PhoneNumberUtil.getInstance() @@ -12,7 +12,7 @@ export class NexmoSmsProvider extends SmsProvider { return new NexmoSmsProvider( fetchEnv('NEXMO_KEY'), fetchEnv('NEXMO_SECRET'), - fetchEnv('NEXMO_BLACKLIST').split(',') + readBlacklistFromEnv('NEXMO_BLACKLIST') ) } type = SmsProviderType.NEXMO diff --git a/packages/attestation-service/src/sms/twilio.ts b/packages/attestation-service/src/sms/twilio.ts index 2db0f986fb3..60c036b5474 100644 --- a/packages/attestation-service/src/sms/twilio.ts +++ b/packages/attestation-service/src/sms/twilio.ts @@ -1,6 +1,6 @@ import twilio, { Twilio } from 'twilio' import { fetchEnv } from '../env' -import { SmsProvider, SmsProviderType } from './base' +import { readBlacklistFromEnv, SmsProvider, SmsProviderType } from './base' export class TwilioSmsProvider extends SmsProvider { static fromEnv() { @@ -8,7 +8,7 @@ export class TwilioSmsProvider extends SmsProvider { fetchEnv('TWILIO_ACCOUNT_SID'), fetchEnv('TWILIO_MESSAGING_SERVICE_SID'), fetchEnv('TWILIO_AUTH_TOKEN'), - fetchEnv('TWILIO_BLACKLIST').split(',') + readBlacklistFromEnv('TWILIO_BLACKLIST') ) } diff --git a/packages/utils/src/collections.ts b/packages/utils/src/collections.ts index dc1c564a030..60027099a7b 100644 --- a/packages/utils/src/collections.ts +++ b/packages/utils/src/collections.ts @@ -22,3 +22,20 @@ export function zip3(as: A[], bs: B[], cs: C[]) { export function notEmpty(value: TValue | null | undefined): value is TValue { return value !== null && value !== undefined } + +export function intersection(arrays: T[][]): T[] { + if (arrays.length === 0) { + return [] + } + + const sets = arrays.map((array) => new Set(array)) + const res: T[] = [] + + for (const elem of arrays[0]) { + if (sets.every((set) => set.has(elem))) { + res.push(elem) + } + } + + return res +} diff --git a/packages/utils/src/io.ts b/packages/utils/src/io.ts index 14708ff1ee8..16327532c68 100644 --- a/packages/utils/src/io.ts +++ b/packages/utils/src/io.ts @@ -82,6 +82,8 @@ export const PublicKeyType = new t.Type( ), String ) +export const SignatureType = t.string +export type Signature = t.TypeOf export type Address = t.TypeOf export type E164Number = t.TypeOf diff --git a/yarn.lock b/yarn.lock index 468588cb712..d484b0331c9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4876,6 +4876,13 @@ resolved "https://registry.yarnpkg.com/@types/events/-/events-1.2.0.tgz#81a6731ce4df43619e5c8c945383b3e62a89ea86" integrity sha512-KEIlhXnIutzKwRbQkGWb/I4HFqBuUykAdHgDED6xqwXJfONCjF5VoE0cXEiurh3XauygxzeDzgtXUqvLkxFzzA== +"@types/express-rate-limit@2.9.3": + version "2.9.3" + resolved "https://registry.yarnpkg.com/@types/express-rate-limit/-/express-rate-limit-2.9.3.tgz#e83a548bf251ad12ca49055c22d3f2da4e16b62d" + integrity sha512-KIiEnkemd20SpTHUvN8Yqr11nddpD1xch3hY5G9GnuaURQ9EnoAi1N2DJQK8n8V0vHBJOcmwnMdufLdWn1GYhQ== + dependencies: + "@types/express" "*" + "@types/express-serve-static-core@*": version "4.11.1" resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.11.1.tgz#f6f7212382d59b19d696677bcaa48a37280f5d45" @@ -14098,6 +14105,11 @@ express-enforces-ssl@^1.1.0: resolved "https://registry.yarnpkg.com/express-enforces-ssl/-/express-enforces-ssl-1.1.0.tgz#cf29c6a61c5bdd802e2c7ed265a4a98e7487d1ac" integrity sha1-zynGphxb3YAuLH7SZaSpjnSH0aw= +express-rate-limit@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/express-rate-limit/-/express-rate-limit-5.0.0.tgz#9a6f4cacc388c1a1da7ba2f65db69f7395e9b04e" + integrity sha512-dhT57wqxfqmkOi4HM7NuT4Gd7gbUgSK2ocG27Y6lwm8lbOAw9XQfeANawGq8wLDtlGPO1ZgDj0HmKsykTxfFAg== + express@4.16.4, express@^4.16.4: version "4.16.4" resolved "https://registry.yarnpkg.com/express/-/express-4.16.4.tgz#fddef61926109e24c515ea97fd2f1bdbf62df12e" @@ -33979,6 +33991,7 @@ websocket@^1.0.28: dependencies: debug "^2.2.0" es5-ext "^0.10.50" + gulp "^4.0.2" nan "^2.14.0" typedarray-to-buffer "^3.1.5" yaeti "^0.0.6" From 3b15c1d59cf4ffd4d8f8f636c06a2479f4585a73 Mon Sep 17 00:00:00 2001 From: Asa Oines Date: Mon, 18 Nov 2019 22:03:28 -0800 Subject: [PATCH 18/61] Explicitly wait for nodes to sync in end-to-end tests (#1752) --- .../src/e2e-tests/governance_tests.ts | 8 ++++--- packages/celotool/src/e2e-tests/sync_tests.ts | 24 ++++++++++--------- packages/celotool/src/e2e-tests/utils.ts | 6 +++++ 3 files changed, 24 insertions(+), 14 deletions(-) diff --git a/packages/celotool/src/e2e-tests/governance_tests.ts b/packages/celotool/src/e2e-tests/governance_tests.ts index 39aea87e9b4..4f6b6c0c236 100644 --- a/packages/celotool/src/e2e-tests/governance_tests.ts +++ b/packages/celotool/src/e2e-tests/governance_tests.ts @@ -14,6 +14,7 @@ import { importGenesis, initAndStartGeth, sleep, + waitToFinishSyncing, } from './utils' interface MemberSwapper { @@ -290,17 +291,17 @@ describe('governance tests', () => { epoch = new BigNumber(await validators.methods.getEpochSize().call()).toNumber() assert.equal(epoch, 10) - // Give the nodes time to sync, and time for an epoch transition so we can activate our vote. + // Wait for an epoch transition so we can activate our vote. let blockNumber: number do { blockNumber = await web3.eth.getBlockNumber() await sleep(0.1) } while (blockNumber % epoch !== 1) - await activate(validatorAccounts[0]) // Prepare for member swapping. const groupWeb3 = new Web3('ws://localhost:8555') + await waitToFinishSyncing(groupWeb3) const groupKit = newKitFromWeb3(groupWeb3) validators = await groupKit._web3Contracts.getValidators() const membersToSwap = [validatorAccounts[0], validatorAccounts[1]] @@ -309,6 +310,7 @@ describe('governance tests', () => { // Prepare for key rotation. const validatorWeb3 = new Web3('http://localhost:8549') const authorizedWeb3s = [new Web3('ws://localhost:8559'), new Web3('ws://localhost:8561')] + await Promise.all(authorizedWeb3s.map((w) => waitToFinishSyncing(w))) const authorizedPrivateKeys = [rotation0PrivateKey, rotation1PrivateKey] const keyRotator = await newKeyRotator( newKitFromWeb3(validatorWeb3), @@ -439,7 +441,7 @@ describe('governance tests', () => { const expectedScore = adjustmentSpeed .times(uptime) .plus(new BigNumber(1).minus(adjustmentSpeed).times(fromFixed(previousScore))) - assert.equal(score.toFixed(), toFixed(expectedScore).toFixed()) + assertAlmostEqual(score, toFixed(expectedScore)) } for (const blockNumber of blockNumbers) { diff --git a/packages/celotool/src/e2e-tests/sync_tests.ts b/packages/celotool/src/e2e-tests/sync_tests.ts index 965bd1a45d8..5a59fd754f2 100644 --- a/packages/celotool/src/e2e-tests/sync_tests.ts +++ b/packages/celotool/src/e2e-tests/sync_tests.ts @@ -7,6 +7,7 @@ import { initAndStartGeth, killInstance, sleep, + waitToFinishSyncing, } from './utils' describe('sync tests', function(this: any) { @@ -28,8 +29,6 @@ describe('sync tests', function(this: any) { await hooks.before() // Restart validator nodes. await hooks.restart() - // Give validators time to connect to eachother. - await sleep(40) const fullInstance = { name: 'full', validating: false, @@ -40,7 +39,8 @@ describe('sync tests', function(this: any) { peers: [await getEnode(8545)], } await initAndStartGeth(hooks.gethBinaryPath, fullInstance) - await sleep(3) + const web3 = new Web3('http://localhost:8553') + await waitToFinishSyncing(web3) }) after(hooks.after) @@ -66,17 +66,19 @@ describe('sync tests', function(this: any) { it('should sync the latest block', async () => { const validatingWeb3 = new Web3(`http://localhost:8545`) - const validatingFirstBlock = await validatingWeb3.eth.getBlock('latest') - await sleep(20) - const validatingLatestBlock = await validatingWeb3.eth.getBlock('latest') - await sleep(3) + const validatingFirstBlock = await validatingWeb3.eth.getBlockNumber() const syncWeb3 = new Web3(`http://localhost:8555`) - const syncLatestBlock = await syncWeb3.eth.getBlock('latest') - assert.isAbove(validatingLatestBlock.number, 1) + await waitToFinishSyncing(syncWeb3) + // Give the validators time to create more blocks. + await sleep(2) + const validatingLatestBlock = await validatingWeb3.eth.getBlockNumber() + await sleep(1) + const syncLatestBlock = await syncWeb3.eth.getBlockNumber() + assert.isAbove(validatingLatestBlock, 1) // Assert that the validator is still producing blocks. - assert.isAbove(validatingLatestBlock.number, validatingFirstBlock.number) + assert.isAbove(validatingLatestBlock, validatingFirstBlock) // Assert that the syncing node has synced with the validator. - assert.isAtLeast(syncLatestBlock.number, validatingLatestBlock.number) + assert.isAtLeast(syncLatestBlock, validatingLatestBlock) }) }) } diff --git a/packages/celotool/src/e2e-tests/utils.ts b/packages/celotool/src/e2e-tests/utils.ts index 02941a966bb..d078983fe61 100644 --- a/packages/celotool/src/e2e-tests/utils.ts +++ b/packages/celotool/src/e2e-tests/utils.ts @@ -41,6 +41,12 @@ const GENESIS_PATH = `${TEST_DIR}/genesis.json` const NetworkId = 1101 const MonorepoRoot = resolvePath(joinPath(__dirname, '../..', '../..')) +export async function waitToFinishSyncing(web3: any) { + while ((await web3.eth.isSyncing()) || (await web3.eth.getBlockNumber()) === 0) { + await sleep(0.1) + } +} + export function assertAlmostEqual( actual: BigNumber, expected: BigNumber, From fc0876197a6956b6dc732635e6c5c0178fc21ce4 Mon Sep 17 00:00:00 2001 From: Jean Regisser Date: Tue, 19 Nov 2019 14:24:09 +0100 Subject: [PATCH 19/61] Deduplicate yarn packages (#1549) --- packages/celotool/src/lib/generate_utils.ts | 3 +- packages/celotool/src/lib/utils.ts | 8 +- .../src/test-utils/PromiEventStub.ts | 3 + packages/mobile/src/qrcode/QRScanner.tsx | 2 +- .../src/verify/VerificationInputScreen.tsx | 2 +- .../verify/VerificationInterstitialScreen.tsx | 2 +- packages/mobile/src/web3/saga.ts | 2 +- .../react-components/analytics/wrapper.tsx | 4 +- .../transaction-metrics-exporter/src/index.ts | 4 +- yarn.lock | 4671 ++--------------- 10 files changed, 493 insertions(+), 4208 deletions(-) diff --git a/packages/celotool/src/lib/generate_utils.ts b/packages/celotool/src/lib/generate_utils.ts index 8ac29e1e909..fdef4c9f1fb 100644 --- a/packages/celotool/src/lib/generate_utils.ts +++ b/packages/celotool/src/lib/generate_utils.ts @@ -4,7 +4,7 @@ import { ec as EC } from 'elliptic' import fs from 'fs' import { range, repeat } from 'lodash' import path from 'path' -import rlp from 'rlp' +import * as rlp from 'rlp' import Web3 from 'web3' import { envVar, fetchEnv, fetchEnvOrFallback, monorepoRoot } from './env-utils' import { @@ -166,7 +166,6 @@ const generateIstanbulExtraData = (validators: Validator[]) => { '0x' + repeat('0', istanbulVanity * 2) + rlp - // @ts-ignore .encode([ // Added validators validators.map((validator) => Buffer.from(validator.address, 'hex')), diff --git a/packages/celotool/src/lib/utils.ts b/packages/celotool/src/lib/utils.ts index dfbf2887fa1..7b592034109 100644 --- a/packages/celotool/src/lib/utils.ts +++ b/packages/celotool/src/lib/utils.ts @@ -42,8 +42,12 @@ export function execCmd( ) if (pipeOutput) { - execProcess.stdout.pipe(process.stdout) - execProcess.stderr.pipe(process.stderr) + if (execProcess.stdout) { + execProcess.stdout.pipe(process.stdout) + } + if (execProcess.stderr) { + execProcess.stderr.pipe(process.stderr) + } } }) } diff --git a/packages/contractkit/src/test-utils/PromiEventStub.ts b/packages/contractkit/src/test-utils/PromiEventStub.ts index 2897ddb52d0..c1dd41c5ad0 100644 --- a/packages/contractkit/src/test-utils/PromiEventStub.ts +++ b/packages/contractkit/src/test-utils/PromiEventStub.ts @@ -12,6 +12,9 @@ interface PromiEventStub extends PromiEvent { export function promiEventSpy(): PromiEventStub { const ee = new EventEmitter() const pe: PromiEventStub = { + finally: () => { + throw new Error('not implemented') + }, catch: () => { throw new Error('not implemented') }, diff --git a/packages/mobile/src/qrcode/QRScanner.tsx b/packages/mobile/src/qrcode/QRScanner.tsx index 0ca8521ccc7..2a31ed54fb5 100644 --- a/packages/mobile/src/qrcode/QRScanner.tsx +++ b/packages/mobile/src/qrcode/QRScanner.tsx @@ -51,7 +51,7 @@ class QRScanner extends React.Component { Logger.debug('QRScanner', 'Bar code detected') this.props.handleBarcodeDetected(rawData) }) - this.timeout = setTimeout(() => { + this.timeout = window.setTimeout(() => { this.setState({ isScanningEnabled: true }) }, 1000) } diff --git a/packages/mobile/src/verify/VerificationInputScreen.tsx b/packages/mobile/src/verify/VerificationInputScreen.tsx index 2b135131154..b7c4b0f1ec5 100644 --- a/packages/mobile/src/verify/VerificationInputScreen.tsx +++ b/packages/mobile/src/verify/VerificationInputScreen.tsx @@ -91,7 +91,7 @@ class VerificationInputScreen extends React.Component { } componentDidMount() { - this.interval = setInterval(() => { + this.interval = window.setInterval(() => { const timer = this.state.timer if (timer === 1) { clearInterval(this.interval) diff --git a/packages/mobile/src/verify/VerificationInterstitialScreen.tsx b/packages/mobile/src/verify/VerificationInterstitialScreen.tsx index d76b40486ed..21580dbfbbf 100644 --- a/packages/mobile/src/verify/VerificationInterstitialScreen.tsx +++ b/packages/mobile/src/verify/VerificationInterstitialScreen.tsx @@ -24,7 +24,7 @@ class VerificationInterstitialScreen extends React.Component { timeout: number | undefined componentDidMount() { - this.timeout = setTimeout(() => { + this.timeout = window.setTimeout(() => { navigate(Screens.VerificationInputScreen) }, SCREEN_DURATION) } diff --git a/packages/mobile/src/web3/saga.ts b/packages/mobile/src/web3/saga.ts index 01ccc318b8a..db2a736eded 100644 --- a/packages/mobile/src/web3/saga.ts +++ b/packages/mobile/src/web3/saga.ts @@ -64,7 +64,7 @@ export function* checkWeb3SyncProgress() { Logger.debug(TAG, 'checkWeb3SyncProgress', 'Checking sync progress') // isSyncing returns a syncProgress object when it's still syncing, false otherwise - const syncProgress = yield web3.eth.isSyncing() + const syncProgress = yield call(web3.eth.isSyncing) if (typeof syncProgress === 'boolean' && !syncProgress) { Logger.debug(TAG, 'checkWeb3SyncProgress', 'Sync maybe complete, checking') diff --git a/packages/react-components/analytics/wrapper.tsx b/packages/react-components/analytics/wrapper.tsx index 60d1c8e0101..fedb2665d74 100644 --- a/packages/react-components/analytics/wrapper.tsx +++ b/packages/react-components/analytics/wrapper.tsx @@ -58,8 +58,8 @@ export default function Initializer(CeloAnalytics: CeloAnalyticsType, Logger: Re } } - function forwardRef(props: {}, ref?: React.Ref>) { - return + function forwardRef(props: P, ref: any) { + return } forwardRef.displayName = `WithAnalytics(${displayName})` diff --git a/packages/transaction-metrics-exporter/src/index.ts b/packages/transaction-metrics-exporter/src/index.ts index 12b21fc7962..de738dddd08 100644 --- a/packages/transaction-metrics-exporter/src/index.ts +++ b/packages/transaction-metrics-exporter/src/index.ts @@ -2,8 +2,8 @@ import express from 'express' import * as PromClient from 'prom-client' import { metricExporterWithRestart } from './blockchain' -process.on('unhandledRejection', (error) => { - console.log('unhandledRejection', error.message) +process.on('unhandledRejection', (reason) => { + console.log('unhandledRejection', reason) process.exit(1) }) diff --git a/yarn.lock b/yarn.lock index d484b0331c9..7977b7af497 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,18 +2,7 @@ # yarn lockfile v1 -"@0x/assert@^2.0.10": - version "2.0.10" - resolved "https://registry.yarnpkg.com/@0x/assert/-/assert-2.0.10.tgz#e1cfc7142b5dd7ee6510a676703935cf8ffd432e" - integrity sha512-tM3j5aZnJGTMr+7OAF61gmflrgEpUkp1LHNsnIx5VnVG+X7JzwV87O44PU9bALVQI1ufYvAUwhIkmK8jbR5Agw== - dependencies: - "@0x/json-schemas" "^3.0.10" - "@0x/typescript-typings" "^4.2.2" - "@0x/utils" "^4.3.3" - lodash "^4.17.11" - valid-url "^1.0.9" - -"@0x/assert@^2.1.5": +"@0x/assert@^2.0.10", "@0x/assert@^2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@0x/assert/-/assert-2.1.5.tgz#f29c7cb243507379242b608e904de9f232cb98ce" integrity sha512-5hnawNxXq4bB5A1QTNrLIjatE+DBGEy/KyaST5Ghu5Mj1N6ot2WpnyE9P1NZmnXPy+jBjZ/mHMRfoVx3Sr9UWw== @@ -39,16 +28,6 @@ ethereum-types "^2.1.5" lodash "^4.17.11" -"@0x/json-schemas@^3.0.10": - version "3.0.10" - resolved "https://registry.yarnpkg.com/@0x/json-schemas/-/json-schemas-3.0.10.tgz#e15ea419ffb5af81f7eff7f6b3ac7602ca0b6957" - integrity sha512-RHYIaxf8C7GO/6VViD8zzRfs1B/i7P5vpCgPk8VR+aVDJXtceF9Nn72KiHeiHU9REUxMWgI3fzhYqTp5/CSbjA== - dependencies: - "@0x/typescript-typings" "^4.2.2" - "@types/node" "*" - jsonschema "^1.2.0" - lodash.values "^4.3.0" - "@0x/json-schemas@^4.0.1": version "4.0.1" resolved "https://registry.yarnpkg.com/@0x/json-schemas/-/json-schemas-4.0.1.tgz#8cf679184f7adfeda005febe295346aa90720920" @@ -223,16 +202,7 @@ optionalDependencies: "@ledgerhq/hw-transport-node-hid" "^4.3.0" -"@0x/types@^2.2.2": - version "2.2.2" - resolved "https://registry.yarnpkg.com/@0x/types/-/types-2.2.2.tgz#ac54c810384795e200384cb4a261152c0aea5040" - integrity sha512-25F3yjvdWGwiQ99CtFcvyL83PTR2fGQk7J1RzuGbqhu9LTdktjhbQl2/FUzPqbAnGXH47zh1ZZrrMSUVIW9SEA== - dependencies: - "@types/node" "*" - bignumber.js "~8.0.2" - ethereum-types "^2.1.2" - -"@0x/types@^2.4.2": +"@0x/types@^2.2.2", "@0x/types@^2.4.2": version "2.4.2" resolved "https://registry.yarnpkg.com/@0x/types/-/types-2.4.2.tgz#1d6dd85d9ac20f267a1206b477caf55e90522879" integrity sha512-Thp9QoH8wZ8LPaOrUAY57u9AKheA0QwvuAinv8uPPlU2+vmIaJyZamMPg18/X21x0JHuuoJ4PWLqEXhMRJUQ5A== @@ -241,18 +211,7 @@ bignumber.js "~8.0.2" ethereum-types "^2.1.5" -"@0x/typescript-typings@^4.2.2": - version "4.2.2" - resolved "https://registry.yarnpkg.com/@0x/typescript-typings/-/typescript-typings-4.2.2.tgz#6c3e51e479c1ecf9e9b3eeae95a51a91be11570a" - integrity sha512-KKioCi4rLOiC62DF8mqBgN639DdGcJllW7OSPi6gWG4w2JI0mvH6KpRA7wGS9fyIpupjpKTIvz6ktZBaG+DrWg== - dependencies: - "@types/bn.js" "^4.11.0" - "@types/react" "*" - bignumber.js "~8.0.2" - ethereum-types "^2.1.2" - popper.js "1.14.3" - -"@0x/typescript-typings@^4.2.5": +"@0x/typescript-typings@^4.2.2", "@0x/typescript-typings@^4.2.5": version "4.2.5" resolved "https://registry.yarnpkg.com/@0x/typescript-typings/-/typescript-typings-4.2.5.tgz#3ceebadd60377abc6e4d2e86c2585ddaf857abef" integrity sha512-mCuOVKpgQkDvlcP6ZnD2kk+vt8OH6xa6uTxPgBZci2rnLiJLKMk1bsHLvFcbwNO5J/tO8DpZnHEwSx2FKaCviw== @@ -263,26 +222,7 @@ ethereum-types "^2.1.5" popper.js "1.14.3" -"@0x/utils@^4.3.3": - version "4.3.3" - resolved "https://registry.yarnpkg.com/@0x/utils/-/utils-4.3.3.tgz#56ab7b42a2a938057bf191e83054aa75a25a18f5" - integrity sha512-gAFKM8kV5I4A6mpn4+nl9pkstyDiFfQBGz4JBI6ES7s/HRetenVurFN8v1EpEF4N/SOtTzqhGerDUVVtrM3YSQ== - dependencies: - "@0x/types" "^2.2.2" - "@0x/typescript-typings" "^4.2.2" - "@types/node" "*" - abortcontroller-polyfill "^1.1.9" - bignumber.js "~8.0.2" - chalk "^2.3.0" - detect-node "2.0.3" - ethereum-types "^2.1.2" - ethereumjs-util "^5.1.1" - ethers "~4.0.4" - isomorphic-fetch "2.2.1" - js-sha3 "^0.7.0" - lodash "^4.17.11" - -"@0x/utils@^4.5.1": +"@0x/utils@^4.3.3", "@0x/utils@^4.5.1": version "4.5.1" resolved "https://registry.yarnpkg.com/@0x/utils/-/utils-4.5.1.tgz#0a5e474eefa5676f22ebdf0cf1e4bef375f26146" integrity sha512-rWFY/abdXPEMf3Ulq6sbVfahjuopiY/ppGTmGGHlhvoQkS7Tl6hEClwof6ISwn3R4V9oIzJayi2FNOP2qoJmNw== @@ -301,7 +241,7 @@ js-sha3 "^0.7.0" lodash "^4.17.11" -"@0x/web3-wrapper@^6.0.12": +"@0x/web3-wrapper@^6.0.12", "@0x/web3-wrapper@^6.0.6": version "6.0.12" resolved "https://registry.yarnpkg.com/@0x/web3-wrapper/-/web3-wrapper-6.0.12.tgz#979731dd87bc99d58e3d62a5c471cb1129017393" integrity sha512-sTRyb5oxXfkY2Wln9hpF2uFOAJeaERhevwKwjcVdjIfHU4gm+JoYgcIJsMhnO/L4LtRcPlMVplvC6V49eKzVRw== @@ -315,20 +255,6 @@ ethers "~4.0.4" lodash "^4.17.11" -"@0x/web3-wrapper@^6.0.6": - version "6.0.6" - resolved "https://registry.yarnpkg.com/@0x/web3-wrapper/-/web3-wrapper-6.0.6.tgz#bf2b07ba9f309e4c7a25dd1b25b2e9de67d0afc9" - integrity sha512-cmDHgYnPGNs6ItMw5h+hLe3Cvqaj6V1RY14ZMCc87L7PrwUFQLnrmSfKcsjaqsNDEmbjLf2dNL25DVu6FN/uyw== - dependencies: - "@0x/assert" "^2.0.10" - "@0x/json-schemas" "^3.0.10" - "@0x/typescript-typings" "^4.2.2" - "@0x/utils" "^4.3.3" - ethereum-types "^2.1.2" - ethereumjs-util "^5.1.1" - ethers "~4.0.4" - lodash "^4.17.11" - "@apollographql/apollo-tools@^0.3.3": version "0.3.3" resolved "https://registry.yarnpkg.com/@apollographql/apollo-tools/-/apollo-tools-0.3.3.tgz#7ec7af07021336ab6947e21e290dd06cb705233e" @@ -381,21 +307,14 @@ imurmurhash "^0.1.4" slide "^1.1.5" -"@babel/code-frame@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8" - integrity sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA== - dependencies: - "@babel/highlight" "^7.0.0" - -"@babel/code-frame@^7.5.5": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.5.5": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.5.5.tgz#bc0782f6d69f7b7d49531219699b988f669a8f9d" integrity sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw== dependencies: "@babel/highlight" "^7.0.0" -"@babel/core@7.1.2", "@babel/core@^7.0.0": +"@babel/core@7.1.2": version "7.1.2" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.1.2.tgz#f8d2a9ceb6832887329a7b60f9d035791400ba4e" integrity sha512-IFeSSnjXdhDaoysIlev//UzHZbdEmm7D0EIH2qtse9xK7mXEZQpYjs2P00XlP1qYsYvid79p+Zgg6tz1mp6iVw== @@ -415,47 +334,7 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/core@^7.1.0": - version "7.2.2" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.2.2.tgz#07adba6dde27bb5ad8d8672f15fde3e08184a687" - integrity sha512-59vB0RWt09cAct5EIe58+NzGP4TFSD3Bz//2/ELy3ZeTeKF6VTD1AXlH8BGGbCX0PuobZBsIzO7IAI9PH67eKw== - dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/generator" "^7.2.2" - "@babel/helpers" "^7.2.0" - "@babel/parser" "^7.2.2" - "@babel/template" "^7.2.2" - "@babel/traverse" "^7.2.2" - "@babel/types" "^7.2.2" - convert-source-map "^1.1.0" - debug "^4.1.0" - json5 "^2.1.0" - lodash "^4.17.10" - resolve "^1.3.2" - semver "^5.4.1" - source-map "^0.5.0" - -"@babel/core@^7.4.5": - version "7.4.5" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.4.5.tgz#081f97e8ffca65a9b4b0fdc7e274e703f000c06a" - integrity sha512-OvjIh6aqXtlsA8ujtGKfC7LYWksYSX8yQcM8Ay3LuvVeQ63lcOKgoZWVqcpFwkd29aYU9rVx7jxhfhiEDV9MZA== - dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/generator" "^7.4.4" - "@babel/helpers" "^7.4.4" - "@babel/parser" "^7.4.5" - "@babel/template" "^7.4.4" - "@babel/traverse" "^7.4.5" - "@babel/types" "^7.4.4" - convert-source-map "^1.1.0" - debug "^4.1.0" - json5 "^2.1.0" - lodash "^4.17.11" - resolve "^1.3.2" - semver "^5.4.1" - source-map "^0.5.0" - -"@babel/core@^7.6.2": +"@babel/core@^7.0.0", "@babel/core@^7.1.0", "@babel/core@^7.4.5", "@babel/core@^7.6.2": version "7.6.3" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.6.3.tgz#44de824e89eaa089bb12da7337bc9bdff2ab68f9" integrity sha512-QfQ5jTBgXLzJuo7Mo8bZK/ePywmgNRgk/UQykiKwEtZPiFIn8ZqE6jB+AnD1hbB1S2xQyL4//it5vuAUOVAMTw== @@ -475,73 +354,7 @@ semver "^5.4.1" source-map "^0.6.1" -"@babel/generator@^7.0.0", "@babel/generator@^7.1.2": - version "7.1.2" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.1.2.tgz#fde75c072575ce7abbd97322e8fef5bae67e4630" - integrity sha512-70A9HWLS/1RHk3Ck8tNHKxOoKQuSKocYgwDN85Pyl/RBduss6AKxUR7RIZ/lzduQMSYfWEM4DDBu6A+XGbkFig== - dependencies: - "@babel/types" "^7.1.2" - jsesc "^2.5.1" - lodash "^4.17.10" - source-map "^0.5.0" - trim-right "^1.0.1" - -"@babel/generator@^7.1.5": - version "7.1.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.1.5.tgz#615f064d13d95f8f9157c7261f68eddf32ec15b3" - integrity sha512-IO31r62xfMI+wBJVmgx0JR9ZOHty8HkoYpQAjRWUGG9vykBTlGHdArZ8zoFtpUu2gs17K7qTl/TtPpiSi6t+MA== - dependencies: - "@babel/types" "^7.1.5" - jsesc "^2.5.1" - lodash "^4.17.10" - source-map "^0.5.0" - trim-right "^1.0.1" - -"@babel/generator@^7.2.2": - version "7.2.2" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.2.2.tgz#18c816c70962640eab42fe8cae5f3947a5c65ccc" - integrity sha512-I4o675J/iS8k+P38dvJ3IBGqObLXyQLTxtrR4u9cSUJOURvafeEWb/pFMOTwtNrmq73mJzyF6ueTbO1BtN0Zeg== - dependencies: - "@babel/types" "^7.2.2" - jsesc "^2.5.1" - lodash "^4.17.10" - source-map "^0.5.0" - trim-right "^1.0.1" - -"@babel/generator@^7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.4.0.tgz#c230e79589ae7a729fd4631b9ded4dc220418196" - integrity sha512-/v5I+a1jhGSKLgZDcmAUZ4K/VePi43eRkUs3yePW1HB1iANOD5tqJXwGSG4BZhSksP8J9ejSlwGeTiiOFZOrXQ== - dependencies: - "@babel/types" "^7.4.0" - jsesc "^2.5.1" - lodash "^4.17.11" - source-map "^0.5.0" - trim-right "^1.0.1" - -"@babel/generator@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.4.4.tgz#174a215eb843fc392c7edcaabeaa873de6e8f041" - integrity sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ== - dependencies: - "@babel/types" "^7.4.4" - jsesc "^2.5.1" - lodash "^4.17.11" - source-map "^0.5.0" - trim-right "^1.0.1" - -"@babel/generator@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.5.5.tgz#873a7f936a3c89491b43536d12245b626664e3cf" - integrity sha512-ETI/4vyTSxTzGnU2c49XHv2zhExkv9JHLTwDAFz85kmcwuShvYG2H08FwgIguQf4JC75CBnXAUM5PqeF4fj0nQ== - dependencies: - "@babel/types" "^7.5.5" - jsesc "^2.5.1" - lodash "^4.17.13" - source-map "^0.5.0" - trim-right "^1.0.1" - -"@babel/generator@^7.6.3": +"@babel/generator@^7.0.0", "@babel/generator@^7.1.2", "@babel/generator@^7.6.3": version "7.6.3" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.6.3.tgz#71d5375264f93ec7bac7d9f35a67067733f5578e" integrity sha512-hLhYbAb3pHwxjlijC4AQ7mqZdcoujiNaW7izCT04CIowHK8psN0IN8QjDv0iyFtycF5FowUOTwDloIheI25aMw== @@ -574,24 +387,6 @@ "@babel/types" "^7.0.0" esutils "^2.0.0" -"@babel/helper-call-delegate@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.1.0.tgz#6a957f105f37755e8645343d3038a22e1449cc4a" - integrity sha512-YEtYZrw3GUK6emQHKthltKNZwszBcHK58Ygcis+gVUrF4/FmTVr5CCqQNSfmvg2y+YDEANyYoaLz/SHsnusCwQ== - dependencies: - "@babel/helper-hoist-variables" "^7.0.0" - "@babel/traverse" "^7.1.0" - "@babel/types" "^7.0.0" - -"@babel/helper-call-delegate@^7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.4.0.tgz#f308eabe0d44f451217853aedf4dea5f6fe3294f" - integrity sha512-SdqDfbVdNQCBp3WhK2mNdDvHd3BD6qbmIc43CAyjnsfCmgHMeqgDcM3BzY2lchi7HBJGJ2CVdynLWbezaE4mmQ== - dependencies: - "@babel/helper-hoist-variables" "^7.4.0" - "@babel/traverse" "^7.4.0" - "@babel/types" "^7.4.0" - "@babel/helper-call-delegate@^7.4.4": version "7.4.4" resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.4.4.tgz#87c1f8ca19ad552a736a7a27b1c1fcf8b1ff1f43" @@ -613,24 +408,6 @@ "@babel/helper-replace-supers" "^7.5.5" "@babel/helper-split-export-declaration" "^7.4.4" -"@babel/helper-define-map@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.1.0.tgz#3b74caec329b3c80c116290887c0dd9ae468c20c" - integrity sha512-yPPcW8dc3gZLN+U1mhYV91QU3n5uTbx7DUdf8NnPbjS0RMwBuHi9Xt2MUgppmNz7CJxTBWsGczTiEp1CSOTPRg== - dependencies: - "@babel/helper-function-name" "^7.1.0" - "@babel/types" "^7.0.0" - lodash "^4.17.10" - -"@babel/helper-define-map@^7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.4.0.tgz#cbfd8c1b2f12708e262c26f600cd16ed6a3bc6c9" - integrity sha512-wAhQ9HdnLIywERVcSvX40CEJwKdAa1ID4neI9NXQPDOHwwA+57DqwLiPEVy2AIyWzAk0CQ8qx4awO0VUURwLtA== - dependencies: - "@babel/helper-function-name" "^7.1.0" - "@babel/types" "^7.4.0" - lodash "^4.17.11" - "@babel/helper-define-map@^7.5.5": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.5.5.tgz#3dec32c2046f37e09b28c93eb0b103fd2a25d369" @@ -664,20 +441,6 @@ dependencies: "@babel/types" "^7.0.0" -"@babel/helper-hoist-variables@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.0.0.tgz#46adc4c5e758645ae7a45deb92bab0918c23bb88" - integrity sha512-Ggv5sldXUeSKsuzLkddtyhyHe2YantsxWKNi7A+7LeD12ExRDWTRk29JCXpaHPAbMaIPZSil7n+lq78WY2VY7w== - dependencies: - "@babel/types" "^7.0.0" - -"@babel/helper-hoist-variables@^7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.0.tgz#25b621399ae229869329730a62015bbeb0a6fbd6" - integrity sha512-/NErCuoe/et17IlAQFKWM24qtyYYie7sFIrW/tIQXpck6vAu2hhtYYsKLBWQV+BQZMbcIYPU/QMYuTufrY4aQw== - dependencies: - "@babel/types" "^7.4.0" - "@babel/helper-hoist-variables@^7.4.4": version "7.4.4" resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.4.tgz#0298b5f25c8c09c53102d52ac4a98f773eb2850a" @@ -685,14 +448,7 @@ dependencies: "@babel/types" "^7.4.4" -"@babel/helper-member-expression-to-functions@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0.tgz#8cd14b0a0df7ff00f009e7d7a436945f47c7a16f" - integrity sha512-avo+lm/QmZlv27Zsi0xEor2fKcqWG56D5ae9dzklpIaY7cQMK5N8VSpaNVPPagiqmy7LrEjK1IWdGMOqPu5csg== - dependencies: - "@babel/types" "^7.0.0" - -"@babel/helper-member-expression-to-functions@^7.5.5": +"@babel/helper-member-expression-to-functions@^7.0.0", "@babel/helper-member-expression-to-functions@^7.5.5": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.5.5.tgz#1fb5b8ec4453a93c439ee9fe3aeea4a84b76b590" integrity sha512-5qZ3D1uMclSNqYcXqiHoA0meVdv+xUEex9em2fqMnrk/scphGlGgg66zjMrPJESPwrFJ6sbfFQYUSa0Mz7FabA== @@ -706,19 +462,7 @@ dependencies: "@babel/types" "^7.0.0" -"@babel/helper-module-transforms@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.1.0.tgz#470d4f9676d9fad50b324cdcce5fbabbc3da5787" - integrity sha512-0JZRd2yhawo79Rcm4w0LwSMILFmFXjugG3yqf+P/UsKsRS1mJCmMwwlHDlMg7Avr9LrvSpp4ZSULO9r8jpCzcw== - dependencies: - "@babel/helper-module-imports" "^7.0.0" - "@babel/helper-simple-access" "^7.1.0" - "@babel/helper-split-export-declaration" "^7.0.0" - "@babel/template" "^7.1.0" - "@babel/types" "^7.0.0" - lodash "^4.17.10" - -"@babel/helper-module-transforms@^7.4.4": +"@babel/helper-module-transforms@^7.1.0", "@babel/helper-module-transforms@^7.4.4": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.5.5.tgz#f84ff8a09038dcbca1fd4355661a500937165b4a" integrity sha512-jBeCvETKuJqeiaCdyaheF40aXnnU1+wkSiUs/IQg3tB85up1LyL8x77ClY8qJpuRJUcXQo+ZtdNESmZl4j56Pw== @@ -742,14 +486,7 @@ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250" integrity sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA== -"@babel/helper-regex@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.0.0.tgz#2c1718923b57f9bbe64705ffe5640ac64d9bdb27" - integrity sha512-TR0/N0NDCcUIUEbqV6dCO+LptmmSQFQ7q70lfcEB4URsjD0E1HzicrwUH+ap6BAQ2jhCX9Q4UqZy4wilujWlkg== - dependencies: - lodash "^4.17.10" - -"@babel/helper-regex@^7.4.4": +"@babel/helper-regex@^7.0.0", "@babel/helper-regex@^7.4.4": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.5.5.tgz#0aa6824f7100a2e0e89c1527c23936c152cab351" integrity sha512-CkCYQLkfkiugbRDO8eZn6lRuR8kzZoGXCg3149iTk5se7g6qykSpy3+hELSwquhu+TgHn8nkLiBwHvNX8Hofcw== @@ -767,27 +504,7 @@ "@babel/traverse" "^7.1.0" "@babel/types" "^7.0.0" -"@babel/helper-replace-supers@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.1.0.tgz#5fc31de522ec0ef0899dc9b3e7cf6a5dd655f362" - integrity sha512-BvcDWYZRWVuDeXTYZWxekQNO5D4kO55aArwZOTFXw6rlLQA8ZaDicJR1sO47h+HrnCiDFiww0fSPV0d713KBGQ== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.0.0" - "@babel/helper-optimise-call-expression" "^7.0.0" - "@babel/traverse" "^7.1.0" - "@babel/types" "^7.0.0" - -"@babel/helper-replace-supers@^7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.4.0.tgz#4f56adb6aedcd449d2da9399c2dcf0545463b64c" - integrity sha512-PVwCVnWWAgnal+kJ+ZSAphzyl58XrFeSKSAJRiqg5QToTsjL+Xu1f9+RJ+d+Q0aPhPfBGaYfkox66k86thxNSg== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.0.0" - "@babel/helper-optimise-call-expression" "^7.0.0" - "@babel/traverse" "^7.4.0" - "@babel/types" "^7.4.0" - -"@babel/helper-replace-supers@^7.5.5": +"@babel/helper-replace-supers@^7.1.0", "@babel/helper-replace-supers@^7.5.5": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.5.5.tgz#f84ce43df031222d2bad068d2626cb5799c34bc2" integrity sha512-XvRFWrNnlsow2u7jXDuH4jDDctkxbS7gXssrP4q2nUD606ukXHRvydj346wmNg+zAgpFx4MWf4+usfC93bElJg== @@ -805,20 +522,6 @@ "@babel/template" "^7.1.0" "@babel/types" "^7.0.0" -"@babel/helper-split-export-declaration@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz#3aae285c0311c2ab095d997b8c9a94cad547d813" - integrity sha512-MXkOJqva62dfC0w85mEf/LucPPS/1+04nmmRMPEBUB++hiiThQ2zPtX/mEWQ3mtzCEjIJvPY8nuwxXtQeQwUag== - dependencies: - "@babel/types" "^7.0.0" - -"@babel/helper-split-export-declaration@^7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.0.tgz#571bfd52701f492920d63b7f735030e9a3e10b55" - integrity sha512-7Cuc6JZiYShaZnybDmfwhY4UYHzI6rlqhWjaIqbsJGsIqPimEYy5uh3akSRLMg65LSdSEnJ8a8/bWQN6u2oMGw== - dependencies: - "@babel/types" "^7.4.0" - "@babel/helper-split-export-declaration@^7.4.4": version "7.4.4" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz#ff94894a340be78f53f06af038b205c49d993677" @@ -836,34 +539,7 @@ "@babel/traverse" "^7.1.0" "@babel/types" "^7.0.0" -"@babel/helpers@^7.1.2": - version "7.1.2" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.1.2.tgz#ab752e8c35ef7d39987df4e8586c63b8846234b5" - integrity sha512-Myc3pUE8eswD73aWcartxB16K6CGmHDv9KxOmD2CeOs/FaEAQodr3VYGmlvOmog60vNQ2w8QbatuahepZwrHiA== - dependencies: - "@babel/template" "^7.1.2" - "@babel/traverse" "^7.1.0" - "@babel/types" "^7.1.2" - -"@babel/helpers@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.2.0.tgz#8335f3140f3144270dc63c4732a4f8b0a50b7a21" - integrity sha512-Fr07N+ea0dMcMN8nFpuK6dUIT7/ivt9yKQdEEnjVS83tG2pHwPi03gYmk/tyuwONnZ+sY+GFFPlWGgCtW1hF9A== - dependencies: - "@babel/template" "^7.1.2" - "@babel/traverse" "^7.1.5" - "@babel/types" "^7.2.0" - -"@babel/helpers@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.4.4.tgz#868b0ef59c1dd4e78744562d5ce1b59c89f2f2a5" - integrity sha512-igczbR/0SeuPR8RFfC7tGrbdTbFL3QTvH6D+Z6zNxnTe//GyqmtHmDkzrqDmyZ3eSwPqB/LhyKoU5DXsp+Vp2A== - dependencies: - "@babel/template" "^7.4.4" - "@babel/traverse" "^7.4.4" - "@babel/types" "^7.4.4" - -"@babel/helpers@^7.6.2": +"@babel/helpers@^7.1.2", "@babel/helpers@^7.6.2": version "7.6.2" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.6.2.tgz#681ffe489ea4dcc55f23ce469e58e59c1c045153" integrity sha512-3/bAUL8zZxYs1cdX2ilEE0WobqbCmKWr/889lf2SS0PpDcpEIY8pb1CCyz0pEcX3pEb+MCbks1jIokz2xLtGTA== @@ -881,42 +557,7 @@ esutils "^2.0.2" js-tokens "^4.0.0" -"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.1.2": - version "7.1.2" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.1.2.tgz#85c5c47af6d244fab77bce6b9bd830e38c978409" - integrity sha512-x5HFsW+E/nQalGMw7hu+fvPqnBeBaIr0lWJ2SG0PPL2j+Pm9lYvCrsZJGIgauPIENx0v10INIyFjmSNUD/gSqQ== - -"@babel/parser@^7.1.5": - version "7.1.5" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.1.5.tgz#20b7d5e7e1811ba996f8a868962ea7dd2bfcd2fc" - integrity sha512-WXKf5K5HT6X0kKiCOezJZFljsfxKV1FpU8Tf1A7ZpGvyd/Q4hlrJm2EwoH2onaUq3O4tLDp+4gk0hHPsMyxmOg== - -"@babel/parser@^7.2.0": - version "7.3.3" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.3.3.tgz#092d450db02bdb6ccb1ca8ffd47d8774a91aef87" - integrity sha512-xsH1CJoln2r74hR+y7cg2B5JCPaTh+Hd+EbBRk9nWGSNspuo6krjhX0Om6RnRQuIvFq8wVXCLKH3kwKDYhanSg== - -"@babel/parser@^7.2.2", "@babel/parser@^7.2.3": - version "7.2.3" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.2.3.tgz#32f5df65744b70888d17872ec106b02434ba1489" - integrity sha512-0LyEcVlfCoFmci8mXx8A5oIkpkOgyo8dRHtxBnK9RRBwxO2+JZPNsqtVEZQ7mJFPxnXF9lfmU24mHOPI0qnlkA== - -"@babel/parser@^7.4.0": - version "7.4.2" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.4.2.tgz#b4521a400cb5a871eab3890787b4bc1326d38d91" - integrity sha512-9fJTDipQFvlfSVdD/JBtkiY0br9BtfvW2R8wo6CX/Ej2eMuV0gWPk1M67Mt3eggQvBqYW1FCEk8BN7WvGm/g5g== - -"@babel/parser@^7.4.4", "@babel/parser@^7.4.5": - version "7.4.5" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.4.5.tgz#04af8d5d5a2b044a2a1bffacc1e5e6673544e872" - integrity sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew== - -"@babel/parser@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.5.5.tgz#02f077ac8817d3df4a832ef59de67565e71cca4b" - integrity sha512-E5BN68cqR7dhKan1SfqgPGhQ178bkVKpXTPEXnFJBrEt8/DKRZlybmy+IgYLTeN7tp1R5Ccmbm2rBk17sHYU3g== - -"@babel/parser@^7.6.0", "@babel/parser@^7.6.3": +"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.1.2", "@babel/parser@^7.2.0", "@babel/parser@^7.6.0", "@babel/parser@^7.6.3": version "7.6.3" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.6.3.tgz#9eff8b9c3eeae16a74d8d4ff30da2bd0d6f0487e" integrity sha512-sUZdXlva1dt2Vw2RqbMkmfoImubO0D0gaCrNngV6Hi0DA4x3o4mlrq0tbfY0dZEUIccH8I6wQ4qgEtwcpOR6Qg== @@ -990,7 +631,7 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.0.0" -"@babel/plugin-proposal-object-rest-spread@7.0.0", "@babel/plugin-proposal-object-rest-spread@^7.0.0": +"@babel/plugin-proposal-object-rest-spread@7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.0.0.tgz#9a17b547f64d0676b6c9cecd4edf74a82ab85e7e" integrity sha512-14fhfoPcNu7itSen7Py1iGN0gEm87hX/B+8nZPqkdmANyyYWYMY2pjA3r8WXbWVKMzfnSNS0xY8GVS0IjXi/iw== @@ -998,7 +639,7 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-object-rest-spread" "^7.0.0" -"@babel/plugin-proposal-object-rest-spread@^7.5.5": +"@babel/plugin-proposal-object-rest-spread@^7.0.0", "@babel/plugin-proposal-object-rest-spread@^7.5.5": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.5.5.tgz#61939744f71ba76a3ae46b5eea18a54c16d22e58" integrity sha512-F2DxJJSQ7f64FyTVl5cw/9MWn6naXGdk3Q3UhDbFEEHv+EilCPoeRD3Zh/Utx1CJz4uyKlQ4uH+bJPbEhMV7Zw== @@ -1006,15 +647,7 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-object-rest-spread" "^7.2.0" -"@babel/plugin-proposal-optional-catch-binding@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.0.0.tgz#b610d928fe551ff7117d42c8bb410eec312a6425" - integrity sha512-JPqAvLG1s13B/AuoBjdBYvn38RqW6n1TzrQO839/sIpqLpbnXKacsAgpZHzLD83Sm8SDXMkkrAvEnJ25+0yIpw== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-optional-catch-binding" "^7.0.0" - -"@babel/plugin-proposal-optional-catch-binding@^7.2.0": +"@babel/plugin-proposal-optional-catch-binding@^7.0.0", "@babel/plugin-proposal-optional-catch-binding@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz#135d81edb68a081e55e56ec48541ece8065c38f5" integrity sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g== @@ -1030,16 +663,7 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-optional-chaining" "^7.0.0" -"@babel/plugin-proposal-unicode-property-regex@^7.0.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.2.0.tgz#abe7281fe46c95ddc143a65e5358647792039520" - integrity sha512-LvRVYb7kikuOtIoUeWTkOxQEV1kYvL5B6U3iWEGCzPNRus1MzJweFqORTj+0jkxozkTSYNJozPOddxmqdqsRpw== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-regex" "^7.0.0" - regexpu-core "^4.2.0" - -"@babel/plugin-proposal-unicode-property-regex@^7.4.4": +"@babel/plugin-proposal-unicode-property-regex@^7.0.0", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": version "7.4.4" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.4.4.tgz#501ffd9826c0b91da22690720722ac7cb1ca9c78" integrity sha512-j1NwnOqMG9mFUOH58JTFsA/+ZYzQLUZ/drqWUqxCYLGeu2JFZL8YrNC9hBxKmWtAuOCHPcRpgv7fhap09Fb4kA== @@ -1069,14 +693,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-syntax-dynamic-import@7.0.0", "@babel/plugin-syntax-dynamic-import@^7.0.0": +"@babel/plugin-syntax-dynamic-import@7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.0.0.tgz#6dfb7d8b6c3be14ce952962f658f3b7eb54c33ee" integrity sha512-Gt9xNyRrCHCiyX/ZxDGOcBnlJl0I3IWicpZRC4CdC0P5a/I07Ya2OAMEBU+J7GmRFVmIetqEYRko6QYRuKOESw== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-syntax-dynamic-import@^7.2.0": +"@babel/plugin-syntax-dynamic-import@^7.0.0", "@babel/plugin-syntax-dynamic-import@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz#69c159ffaf4998122161ad8ebc5e6d1f55df8612" integrity sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w== @@ -1090,14 +714,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-syntax-flow@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.0.0.tgz#70638aeaad9ee426bc532e51523cff8ff02f6f17" - integrity sha512-zGcuZWiWWDa5qTZ6iAnpG0fnX/GOu49pGR5PFvkQ9GmKNaSphXQnlNXh/LG20sqWtNrx/eB6krzfEzcwvUyeFA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-syntax-flow@^7.2.0": +"@babel/plugin-syntax-flow@^7.0.0", "@babel/plugin-syntax-flow@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.2.0.tgz#a765f061f803bc48f240c26f8747faf97c26bf7c" integrity sha512-r6YMuZDWLtLlu0kqIim5o/3TNRAlWb073HwT3e2nKf9I8IIvOggPrnILYPsrrKilmn/mYEMCf/Z07w3yQJF6dg== @@ -1111,14 +728,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-syntax-jsx@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.0.0.tgz#034d5e2b4e14ccaea2e4c137af7e4afb39375ffd" - integrity sha512-PdmL2AoPsCLWxhIr3kG2+F9v4WH06Q3z+NoGVpQgnUNGcagXHq5sB3OXxkSahKq9TLdNMN/AJzFYSOo8UKDMHg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-syntax-jsx@^7.2.0": +"@babel/plugin-syntax-jsx@^7.0.0", "@babel/plugin-syntax-jsx@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.2.0.tgz#0b85a3b4bc7cdf4cc4b8bf236335b907ca22e7c7" integrity sha512-VyN4QANJkRW6lDBmENzRszvZf3/4AXaj9YR7GwrWeeN9tEBPuXbmDYVU9bYBN0D70zCWVwUy0HWq2553VCb6Hw== @@ -1132,28 +742,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-syntax-object-rest-spread@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.0.0.tgz#37d8fbcaf216bd658ea1aebbeb8b75e88ebc549b" - integrity sha512-5A0n4p6bIiVe5OvQPxBnesezsgFJdHhSs3uFSvaPdMqtsovajLZ+G2vZyvNe10EzJBWWo3AcHGKhAFUxqwp2dw== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-syntax-object-rest-spread@^7.2.0": +"@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz#3b7a3e733510c57e820b9142a6579ac8b0dfad2e" integrity sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-syntax-optional-catch-binding@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.0.0.tgz#886f72008b3a8b185977f7cb70713b45e51ee475" - integrity sha512-Wc+HVvwjcq5qBg1w5RG9o9RVzmCaAg/Vp0erHCKpAYV8La6I94o4GQAmFYNmkzoMO6gzoOSulpKeSSz6mPEoZw== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-syntax-optional-catch-binding@^7.2.0": +"@babel/plugin-syntax-optional-catch-binding@^7.0.0", "@babel/plugin-syntax-optional-catch-binding@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz#a94013d6eda8908dfe6a477e7f9eda85656ecf5c" integrity sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w== @@ -1167,13 +763,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-syntax-typescript@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.0.0.tgz#90f4fe0a741ae9c0dcdc3017717c05a0cbbd5158" - integrity sha512-5fxmdqiAQVQTIS+KSvYeZuTt91wKtBTYi6JlIkvbQ6hmO+9fZE81ezxmMiFMIsxE7CdRSgzn7nQ1BChcvK9OpA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-typescript@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.2.0.tgz#55d240536bd314dcbbec70fd949c5cabaed1de29" @@ -1181,39 +770,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-arrow-functions@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.0.0.tgz#a6c14875848c68a3b4b3163a486535ef25c7e749" - integrity sha512-2EZDBl1WIO/q4DIkIp4s86sdp4ZifL51MoIviLY/gG/mLSuOIEg7J8o6mhbxOTvUJkaN50n+8u41FVsr5KLy/w== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-arrow-functions@^7.2.0": +"@babel/plugin-transform-arrow-functions@^7.0.0", "@babel/plugin-transform-arrow-functions@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz#9aeafbe4d6ffc6563bf8f8372091628f00779550" integrity sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-async-to-generator@^7.0.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.1.0.tgz#109e036496c51dd65857e16acab3bafdf3c57811" - integrity sha512-rNmcmoQ78IrvNCIt/R9U+cixUHeYAzgusTFgIAv+wQb9HJU4szhpDD6e5GCACmj/JP5KxuCwM96bX3L9v4ZN/g== - dependencies: - "@babel/helper-module-imports" "^7.0.0" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-remap-async-to-generator" "^7.1.0" - -"@babel/plugin-transform-async-to-generator@^7.1.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.4.0.tgz#234fe3e458dce95865c0d152d256119b237834b0" - integrity sha512-EeaFdCeUULM+GPFEsf7pFcNSxM7hYjoj5fiYbyuiXobW4JhFnjAv9OWzNwHyHcKoPNpAfeRDuW6VyaXEDUBa7g== - dependencies: - "@babel/helper-module-imports" "^7.0.0" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-remap-async-to-generator" "^7.1.0" - -"@babel/plugin-transform-async-to-generator@^7.5.0": +"@babel/plugin-transform-async-to-generator@^7.0.0", "@babel/plugin-transform-async-to-generator@^7.1.0", "@babel/plugin-transform-async-to-generator@^7.5.0": version "7.5.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.5.0.tgz#89a3848a0166623b5bc481164b5936ab947e887e" integrity sha512-mqvkzwIGkq0bEF1zLRRiTdjfomZJDV33AH3oQzHVGkI2VzEmXLpKKOBvEVaFZBJdN0XTyH38s9j/Kiqr68dggg== @@ -1222,29 +786,14 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-remap-async-to-generator" "^7.1.0" -"@babel/plugin-transform-block-scoped-functions@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.0.0.tgz#482b3f75103927e37288b3b67b65f848e2aa0d07" - integrity sha512-AOBiyUp7vYTqz2Jibe1UaAWL0Hl9JUXEgjFvvvcSc9MVDItv46ViXFw2F7SVt1B5k+KWjl44eeXOAk3UDEaJjQ== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-block-scoped-functions@^7.2.0": +"@babel/plugin-transform-block-scoped-functions@^7.0.0", "@babel/plugin-transform-block-scoped-functions@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz#5d3cc11e8d5ddd752aa64c9148d0db6cb79fd190" integrity sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-block-scoping@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.0.0.tgz#1745075edffd7cdaf69fab2fb6f9694424b7e9bc" - integrity sha512-GWEMCrmHQcYWISilUrk9GDqH4enf3UmhOEbNbNrlNAX1ssH3MsS1xLOS6rdjRVPgA7XXVPn87tRkdTEoA/dxEg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - lodash "^4.17.10" - -"@babel/plugin-transform-block-scoping@^7.5.5": +"@babel/plugin-transform-block-scoping@^7.0.0", "@babel/plugin-transform-block-scoping@^7.5.5": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.5.5.tgz#a35f395e5402822f10d2119f6f8e045e3639a2ce" integrity sha512-82A3CLRRdYubkG85lKwhZB0WZoHxLGsJdux/cOVaJCJpvYFl1LVzAIFyRsa7CvXqW8rBM4Zf3Bfn8PHt5DP0Sg== @@ -1252,35 +801,7 @@ "@babel/helper-plugin-utils" "^7.0.0" lodash "^4.17.13" -"@babel/plugin-transform-classes@^7.0.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.1.0.tgz#ab3f8a564361800cbc8ab1ca6f21108038432249" - integrity sha512-rNaqoD+4OCBZjM7VaskladgqnZ1LO6o2UxuWSDzljzW21pN1KXkB7BstAVweZdxQkHAujps5QMNOTWesBciKFg== - dependencies: - "@babel/helper-annotate-as-pure" "^7.0.0" - "@babel/helper-define-map" "^7.1.0" - "@babel/helper-function-name" "^7.1.0" - "@babel/helper-optimise-call-expression" "^7.0.0" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-replace-supers" "^7.1.0" - "@babel/helper-split-export-declaration" "^7.0.0" - globals "^11.1.0" - -"@babel/plugin-transform-classes@^7.1.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.4.0.tgz#e3428d3c8a3d01f33b10c529b998ba1707043d4d" - integrity sha512-XGg1Mhbw4LDmrO9rSTNe+uI79tQPdGs0YASlxgweYRLZqo/EQktjaOV4tchL/UZbM0F+/94uOipmdNGoaGOEYg== - dependencies: - "@babel/helper-annotate-as-pure" "^7.0.0" - "@babel/helper-define-map" "^7.4.0" - "@babel/helper-function-name" "^7.1.0" - "@babel/helper-optimise-call-expression" "^7.0.0" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-replace-supers" "^7.4.0" - "@babel/helper-split-export-declaration" "^7.4.0" - globals "^11.1.0" - -"@babel/plugin-transform-classes@^7.5.5": +"@babel/plugin-transform-classes@^7.0.0", "@babel/plugin-transform-classes@^7.1.0", "@babel/plugin-transform-classes@^7.5.5": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.5.5.tgz#d094299d9bd680a14a2a0edae38305ad60fb4de9" integrity sha512-U2htCNK/6e9K7jGyJ++1p5XRU+LJjrwtoiVn9SzRlDT2KubcZ11OOwy3s24TjHxPgxNwonCYP7U2K51uVYCMDg== @@ -1294,44 +815,21 @@ "@babel/helper-split-export-declaration" "^7.4.4" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.0.0.tgz#2fbb8900cd3e8258f2a2ede909b90e7556185e31" - integrity sha512-ubouZdChNAv4AAWAgU7QKbB93NU5sHwInEWfp+/OzJKA02E6Woh9RVoX4sZrbRwtybky/d7baTUqwFx+HgbvMA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-computed-properties@^7.2.0": +"@babel/plugin-transform-computed-properties@^7.0.0", "@babel/plugin-transform-computed-properties@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz#83a7df6a658865b1c8f641d510c6f3af220216da" integrity sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-destructuring@^7.0.0": - version "7.1.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.1.2.tgz#5fa77d473f5a0a3f5266ad7ce2e8c995a164d60a" - integrity sha512-cvToXvp/OsYxtEn57XJu9BvsGSEYjAh9UeUuXpoi7x6QHB7YdWyQ4lRU/q0Fu1IJNT0o0u4FQ1DMQBzJ8/8vZg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-destructuring@^7.5.0": +"@babel/plugin-transform-destructuring@^7.0.0", "@babel/plugin-transform-destructuring@^7.5.0": version "7.5.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.5.0.tgz#f6c09fdfe3f94516ff074fe877db7bc9ef05855a" integrity sha512-YbYgbd3TryYYLGyC7ZR+Tq8H/+bCmwoaxHfJHupom5ECstzbRLTch6gOQbhEY9Z4hiCNHEURgq06ykFv9JZ/QQ== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-dotall-regex@^7.0.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.2.0.tgz#f0aabb93d120a8ac61e925ea0ba440812dbe0e49" - integrity sha512-sKxnyHfizweTgKZf7XsXu/CNupKhzijptfTM+bozonIuyVrLWVUvYjE2bhuSBML8VQeMxq4Mm63Q9qvcvUcciQ== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-regex" "^7.0.0" - regexpu-core "^4.1.3" - -"@babel/plugin-transform-dotall-regex@^7.4.4": +"@babel/plugin-transform-dotall-regex@^7.0.0", "@babel/plugin-transform-dotall-regex@^7.4.4": version "7.4.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.4.4.tgz#361a148bc951444312c69446d76ed1ea8e4450c3" integrity sha512-P05YEhRc2h53lZDjRPk/OektxCVevFzZs2Gfjd545Wde3k+yFDbXORgl2e0xpbq8mLcKJ7Idss4fAg0zORN/zg== @@ -1340,29 +838,14 @@ "@babel/helper-regex" "^7.4.4" regexpu-core "^4.5.4" -"@babel/plugin-transform-duplicate-keys@^7.0.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.2.0.tgz#d952c4930f312a4dbfff18f0b2914e60c35530b3" - integrity sha512-q+yuxW4DsTjNceUiTzK0L+AfQ0zD9rWaTLiUqHA8p0gxx7lu1EylenfzjeIWNkPy6e/0VG/Wjw9uf9LueQwLOw== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-duplicate-keys@^7.5.0": +"@babel/plugin-transform-duplicate-keys@^7.0.0", "@babel/plugin-transform-duplicate-keys@^7.5.0": version "7.5.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.5.0.tgz#c5dbf5106bf84cdf691222c0974c12b1df931853" integrity sha512-igcziksHizyQPlX9gfSjHkE2wmoCH3evvD2qR5w29/Dk0SMKE/eOI7f1HhBdNhR/zxJDqrgpoDTq5YSLH/XMsQ== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-exponentiation-operator@^7.0.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.1.0.tgz#9c34c2ee7fd77e02779cfa37e403a2e1003ccc73" - integrity sha512-uZt9kD1Pp/JubkukOGQml9tqAeI8NkE98oZnHZ2qHRElmeKCodbTZgOEUtujSCSLhHSBWbzNiFSDIMC4/RBTLQ== - dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.1.0" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-exponentiation-operator@^7.1.0", "@babel/plugin-transform-exponentiation-operator@^7.2.0": +"@babel/plugin-transform-exponentiation-operator@^7.0.0", "@babel/plugin-transform-exponentiation-operator@^7.1.0", "@babel/plugin-transform-exponentiation-operator@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz#a63868289e5b4007f7054d46491af51435766008" integrity sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A== @@ -1378,37 +861,14 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-flow" "^7.0.0" -"@babel/plugin-transform-for-of@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.0.0.tgz#f2ba4eadb83bd17dc3c7e9b30f4707365e1c3e39" - integrity sha512-TlxKecN20X2tt2UEr2LNE6aqA0oPeMT1Y3cgz8k4Dn1j5ObT8M3nl9aA37LLklx0PBZKETC9ZAf9n/6SujTuXA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-for-of@^7.4.4": +"@babel/plugin-transform-for-of@^7.0.0", "@babel/plugin-transform-for-of@^7.4.4": version "7.4.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.4.tgz#0267fc735e24c808ba173866c6c4d1440fc3c556" integrity sha512-9T/5Dlr14Z9TIEXLXkt8T1DU7F24cbhwhMNUziN3hB1AXoZcdzPcTiKGRn/6iOymDqtTKWnr/BtRKN9JwbKtdQ== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-function-name@^7.0.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.1.0.tgz#29c5550d5c46208e7f730516d41eeddd4affadbb" - integrity sha512-VxOa1TMlFMtqPW2IDYZQaHsFrq/dDoIjgN098NowhexhZcz3UGlvPgZXuE1jEvNygyWyxRacqDpCZt+par1FNg== - dependencies: - "@babel/helper-function-name" "^7.1.0" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-function-name@^7.1.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.2.0.tgz#f7930362829ff99a3174c39f0afcc024ef59731a" - integrity sha512-kWgksow9lHdvBC2Z4mxTsvc7YdY7w/V6B2vy9cTIPtLEE9NhwoWivaxdNM/S37elu5bqlLP/qOY906LukO9lkQ== - dependencies: - "@babel/helper-function-name" "^7.1.0" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-function-name@^7.4.4": +"@babel/plugin-transform-function-name@^7.0.0", "@babel/plugin-transform-function-name@^7.1.0", "@babel/plugin-transform-function-name@^7.4.4": version "7.4.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.4.4.tgz#e1436116abb0610c2259094848754ac5230922ad" integrity sha512-iU9pv7U+2jC9ANQkKeNF6DrPy4GBa4NWQtl6dHB4Pb3izX2JOEvDTFarlNsBj/63ZEzNNIAMs3Qw4fNCcSOXJA== @@ -1416,43 +876,21 @@ "@babel/helper-function-name" "^7.1.0" "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-literals@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.0.0.tgz#2aec1d29cdd24c407359c930cdd89e914ee8ff86" - integrity sha512-1NTDBWkeNXgpUcyoVFxbr9hS57EpZYXpje92zv0SUzjdu3enaRwF/l3cmyRnXLtIdyJASyiS6PtybK+CgKf7jA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-literals@^7.2.0": +"@babel/plugin-transform-literals@^7.0.0", "@babel/plugin-transform-literals@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz#690353e81f9267dad4fd8cfd77eafa86aba53ea1" integrity sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-member-expression-literals@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.0.0.tgz#96a265bf61a9ed6f75c39db0c30d41ef7aabf072" - integrity sha512-kgAGWcjVdflNPSaRb9rDPdGJ9/gF80VPmxx80gdKz6NSofHvxA2LofECQ+7GrDVzzH8zBJzTn1xlV4xnmWj/nw== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-member-expression-literals@^7.2.0": +"@babel/plugin-transform-member-expression-literals@^7.0.0", "@babel/plugin-transform-member-expression-literals@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.2.0.tgz#fa10aa5c58a2cb6afcf2c9ffa8cb4d8b3d489a2d" integrity sha512-HiU3zKkSU6scTidmnFJ0bMX8hz5ixC93b4MHMiYebmk2lUVNGOboPsqQvx5LzooihijUoLR/v7Nc1rbBtnc7FA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-modules-amd@^7.1.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.2.0.tgz#82a9bce45b95441f617a24011dc89d12da7f4ee6" - integrity sha512-mK2A8ucqz1qhrdqjS9VMIDfIvvT2thrEsIQzbaTdc5QFzhDjQv2CkJJ5f6BXIkgbmaoax3zBr2RyvV/8zeoUZw== - dependencies: - "@babel/helper-module-transforms" "^7.1.0" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-modules-amd@^7.5.0": +"@babel/plugin-transform-modules-amd@^7.1.0", "@babel/plugin-transform-modules-amd@^7.5.0": version "7.5.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.5.0.tgz#ef00435d46da0a5961aa728a1d2ecff063e4fb91" integrity sha512-n20UsQMKnWrltocZZm24cRURxQnWIvsABPJlw/fvoy9c6AgHZzoelAIzajDHAQrDpuKFFPPcFGd7ChsYuIUMpg== @@ -1461,7 +899,7 @@ "@babel/helper-plugin-utils" "^7.0.0" babel-plugin-dynamic-import-node "^2.3.0" -"@babel/plugin-transform-modules-commonjs@7.1.0", "@babel/plugin-transform-modules-commonjs@^7.0.0": +"@babel/plugin-transform-modules-commonjs@7.1.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.1.0.tgz#0a9d86451cbbfb29bd15186306897c67f6f9a05c" integrity sha512-wtNwtMjn1XGwM0AXPspQgvmE6msSJP15CX2RVfpTSTNPLhKhaOjaIfBaVfj4iUZ/VrFSodcFedwtPg/NxwQlPA== @@ -1470,16 +908,7 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-simple-access" "^7.1.0" -"@babel/plugin-transform-modules-commonjs@^7.1.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.4.0.tgz#3b8ec61714d3b75d20c5ccfa157f2c2e087fd4ca" - integrity sha512-iWKAooAkipG7g1IY0eah7SumzfnIT3WNhT4uYB2kIsvHnNSB6MDYVa5qyICSwaTBDBY2c4SnJ3JtEa6ltJd6Jw== - dependencies: - "@babel/helper-module-transforms" "^7.1.0" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-simple-access" "^7.1.0" - -"@babel/plugin-transform-modules-commonjs@^7.4.4", "@babel/plugin-transform-modules-commonjs@^7.5.0": +"@babel/plugin-transform-modules-commonjs@^7.0.0", "@babel/plugin-transform-modules-commonjs@^7.1.0", "@babel/plugin-transform-modules-commonjs@^7.4.4", "@babel/plugin-transform-modules-commonjs@^7.5.0": version "7.5.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.5.0.tgz#425127e6045231360858eeaa47a71d75eded7a74" integrity sha512-xmHq0B+ytyrWJvQTc5OWAC4ii6Dhr0s22STOoydokG51JjWhyYo5mRPXoi+ZmtHQhZZwuXNN+GG5jy5UZZJxIQ== @@ -1489,15 +918,7 @@ "@babel/helper-simple-access" "^7.1.0" babel-plugin-dynamic-import-node "^2.3.0" -"@babel/plugin-transform-modules-systemjs@^7.0.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.2.0.tgz#912bfe9e5ff982924c81d0937c92d24994bb9068" - integrity sha512-aYJwpAhoK9a+1+O625WIjvMY11wkB/ok0WClVwmeo3mCjcNRjt+/8gHWrB5i+00mUju0gWsBkQnPpdvQ7PImmQ== - dependencies: - "@babel/helper-hoist-variables" "^7.0.0" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-modules-systemjs@^7.5.0": +"@babel/plugin-transform-modules-systemjs@^7.0.0", "@babel/plugin-transform-modules-systemjs@^7.5.0": version "7.5.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.5.0.tgz#e75266a13ef94202db2a0620977756f51d52d249" integrity sha512-Q2m56tyoQWmuNGxEtUyeEkm6qJYFqs4c+XyXH5RAuYxObRNz9Zgj/1g2GMnjYp2EUyEy7YTrxliGCXzecl/vJg== @@ -1521,14 +942,7 @@ dependencies: regexp-tree "^0.1.6" -"@babel/plugin-transform-new-target@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.0.0.tgz#ae8fbd89517fa7892d20e6564e641e8770c3aa4a" - integrity sha512-yin069FYjah+LbqfGeTfzIBODex/e++Yfa0rH0fpfam9uTbuEeEOx5GLGr210ggOV77mVRNoeqSYqeuaqSzVSw== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-new-target@^7.4.4": +"@babel/plugin-transform-new-target@^7.0.0", "@babel/plugin-transform-new-target@^7.4.4": version "7.4.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.4.tgz#18d120438b0cc9ee95a47f2c72bc9768fbed60a5" integrity sha512-r1z3T2DNGQwwe2vPGZMBNjioT2scgWzK9BCnDEh+46z8EEwXBq24uRzd65I7pjtugzPSj921aM15RpESgzsSuA== @@ -1542,23 +956,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-object-super@^7.0.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.1.0.tgz#b1ae194a054b826d8d4ba7ca91486d4ada0f91bb" - integrity sha512-/O02Je1CRTSk2SSJaq0xjwQ8hG4zhZGNjE8psTsSNPXyLRCODv7/PBozqT5AmQMzp7MI3ndvMhGdqp9c96tTEw== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-replace-supers" "^7.1.0" - -"@babel/plugin-transform-object-super@^7.1.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.2.0.tgz#b35d4c10f56bab5d650047dad0f1d8e8814b6598" - integrity sha512-VMyhPYZISFZAqAPVkiYb7dUe2AsVi2/wCT5+wZdsNO31FojQJa9ns40hzZ6U9f50Jlq4w6qwzdBB2uwqZ00ebg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-replace-supers" "^7.1.0" - -"@babel/plugin-transform-object-super@^7.5.5": +"@babel/plugin-transform-object-super@^7.0.0", "@babel/plugin-transform-object-super@^7.1.0", "@babel/plugin-transform-object-super@^7.5.5": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.5.5.tgz#c70021df834073c65eb613b8679cc4a381d1a9f9" integrity sha512-un1zJQAhSosGFBduPgN/YFNvWVpRuHKU7IHBglLoLZsGmruJPOo6pbInneflUdmq7YvSVqhpPs5zdBvLnteltQ== @@ -1566,25 +964,7 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-replace-supers" "^7.5.5" -"@babel/plugin-transform-parameters@^7.0.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.1.0.tgz#44f492f9d618c9124026e62301c296bf606a7aed" - integrity sha512-vHV7oxkEJ8IHxTfRr3hNGzV446GAb+0hgbA7o/0Jd76s+YzccdWuTU296FOCOl/xweU4t/Ya4g41yWz80RFCRw== - dependencies: - "@babel/helper-call-delegate" "^7.1.0" - "@babel/helper-get-function-arity" "^7.0.0" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-parameters@^7.1.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.0.tgz#a1309426fac4eecd2a9439a4c8c35124a11a48a9" - integrity sha512-Xqv6d1X+doyiuCGDoVJFtlZx0onAX0tnc3dY8w71pv/O0dODAbusVv2Ale3cGOwfiyi895ivOBhYa9DhAM8dUA== - dependencies: - "@babel/helper-call-delegate" "^7.4.0" - "@babel/helper-get-function-arity" "^7.0.0" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-parameters@^7.4.4": +"@babel/plugin-transform-parameters@^7.0.0", "@babel/plugin-transform-parameters@^7.1.0", "@babel/plugin-transform-parameters@^7.4.4": version "7.4.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.4.tgz#7556cf03f318bd2719fe4c922d2d808be5571e16" integrity sha512-oMh5DUO1V63nZcu/ZVLQFqiihBGo4OpxJxR1otF50GMeCLiRx5nUdtokd+u9SuVJrvvuIh9OosRFPP4pIPnwmw== @@ -1593,14 +973,7 @@ "@babel/helper-get-function-arity" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-property-literals@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.0.0.tgz#0b95a91dbd1f0be5b5a99ed86571ef5b5ae77009" - integrity sha512-7HK6/jB4MLpwQUJQ3diaX0pbCRcoL9asJscQfU3D1HpDwYdrH6yAUKleUNFHFyGNYBI9UeJrS2Jpx2JhtPKu5g== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-property-literals@^7.2.0": +"@babel/plugin-transform-property-literals@^7.0.0", "@babel/plugin-transform-property-literals@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.2.0.tgz#03e33f653f5b25c4eb572c98b9485055b389e905" integrity sha512-9q7Dbk4RhgcLp8ebduOpCbtjh7C0itoLYHXd9ueASKAG/is5PQtMR5VJGka9NKqGhYEGn5ITahd4h9QeBMylWQ== @@ -1639,14 +1012,7 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-jsx" "^7.0.0" -"@babel/plugin-transform-regenerator@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.0.0.tgz#5b41686b4ed40bef874d7ed6a84bdd849c13e0c1" - integrity sha512-sj2qzsEx8KDVv1QuJc/dEfilkg3RRPvPYx/VnKLtItVQRWt1Wqf5eVCOLZm29CiGFfYYsA3VPjfizTCV0S0Dlw== - dependencies: - regenerator-transform "^0.13.3" - -"@babel/plugin-transform-regenerator@^7.4.5": +"@babel/plugin-transform-regenerator@^7.0.0", "@babel/plugin-transform-regenerator@^7.4.5": version "7.4.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.5.tgz#629dc82512c55cee01341fb27bdfcb210354680f" integrity sha512-gBKRh5qAaCWntnd09S8QC7r3auLCqq5DI6O0DlfoyDjslSBVqBibrMdsqO+Uhmx3+BlOmE/Kw1HFxmGbv0N9dA== @@ -1660,7 +1026,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-runtime@7.1.0", "@babel/plugin-transform-runtime@^7.0.0": +"@babel/plugin-transform-runtime@7.1.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.1.0.tgz#9f76920d42551bb577e2dc594df229b5f7624b63" integrity sha512-WFLMgzu5DLQEah0lKTJzYb14vd6UiES7PTnXcvrPZ1VrwFeJ+mTbvr65fFAsXYMt2bIoOoC0jk76zY1S7HZjUg== @@ -1670,7 +1036,7 @@ resolve "^1.8.1" semver "^5.5.1" -"@babel/plugin-transform-runtime@^7.5.5": +"@babel/plugin-transform-runtime@^7.0.0", "@babel/plugin-transform-runtime@^7.5.5": version "7.6.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.6.0.tgz#85a3cce402b28586138e368fce20ab3019b9713e" integrity sha512-Da8tMf7uClzwUm/pnJ1S93m/aRXmoYNDD7TkHua8xBDdaAs54uZpTWvEt6NGwmoVMb9mZbntfTqmG2oSzN/7Vg== @@ -1680,43 +1046,21 @@ resolve "^1.8.1" semver "^5.5.1" -"@babel/plugin-transform-shorthand-properties@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.0.0.tgz#85f8af592dcc07647541a0350e8c95c7bf419d15" - integrity sha512-g/99LI4vm5iOf5r1Gdxq5Xmu91zvjhEG5+yZDJW268AZELAu4J1EiFLnkSG3yuUsZyOipVOVUKoGPYwfsTymhw== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-shorthand-properties@^7.2.0": +"@babel/plugin-transform-shorthand-properties@^7.0.0", "@babel/plugin-transform-shorthand-properties@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz#6333aee2f8d6ee7e28615457298934a3b46198f0" integrity sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-spread@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.0.0.tgz#93583ce48dd8c85e53f3a46056c856e4af30b49b" - integrity sha512-L702YFy2EvirrR4shTj0g2xQp7aNwZoWNCkNu2mcoU0uyzMl0XRwDSwzB/xp6DSUFiBmEXuyAyEN16LsgVqGGQ== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-spread@^7.2.0": +"@babel/plugin-transform-spread@^7.0.0", "@babel/plugin-transform-spread@^7.2.0": version "7.2.2" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.2.2.tgz#3103a9abe22f742b6d406ecd3cd49b774919b406" integrity sha512-KWfky/58vubwtS0hLqEnrWJjsMGaOeSBn90Ezn5Jeg9Z8KKHmELbP1yGylMlm5N6TPKeY9A2+UaSYLdxahg01w== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-sticky-regex@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.0.0.tgz#30a9d64ac2ab46eec087b8530535becd90e73366" - integrity sha512-LFUToxiyS/WD+XEWpkx/XJBrUXKewSZpzX68s+yEOtIbdnsRjpryDw9U06gYc6klYEij/+KQVRnD3nz3AoKmjw== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-regex" "^7.0.0" - -"@babel/plugin-transform-sticky-regex@^7.2.0": +"@babel/plugin-transform-sticky-regex@^7.0.0", "@babel/plugin-transform-sticky-regex@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz#a1e454b5995560a9c1e0d537dfc15061fd2687e1" integrity sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw== @@ -1724,15 +1068,7 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-regex" "^7.0.0" -"@babel/plugin-transform-template-literals@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.0.0.tgz#084f1952efe5b153ddae69eb8945f882c7a97c65" - integrity sha512-vA6rkTCabRZu7Nbl9DfLZE1imj4tzdWcg5vtdQGvj+OH9itNNB6hxuRMHuIY8SGnEt1T9g5foqs9LnrHzsqEFg== - dependencies: - "@babel/helper-annotate-as-pure" "^7.0.0" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-template-literals@^7.4.4": +"@babel/plugin-transform-template-literals@^7.0.0", "@babel/plugin-transform-template-literals@^7.4.4": version "7.4.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.4.4.tgz#9d28fea7bbce637fb7612a0750989d8321d4bcb0" integrity sha512-mQrEC4TWkhLN0z8ygIvEL9ZEToPhG5K7KDW3pzGqOfIGZ28Jb0POUkeWcoz8HnHvhFy6dwAT1j8OzqN8s804+g== @@ -1747,15 +1083,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-typescript@^7.0.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.1.0.tgz#81e7b4be90e7317cbd04bf1163ebf06b2adee60b" - integrity sha512-TOTtVeT+fekAesiCHnPz+PSkYSdOSLyLn42DI45nxg6iCdlQY6LIj/tYqpMB0y+YicoTUiYiXqF8rG6SKfhw6Q== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-typescript" "^7.0.0" - -"@babel/plugin-transform-typescript@^7.1.0": +"@babel/plugin-transform-typescript@^7.0.0", "@babel/plugin-transform-typescript@^7.1.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.2.0.tgz#bce7c06300434de6a860ae8acf6a442ef74a99d1" integrity sha512-EnI7i2/gJ7ZNr2MuyvN2Hu+BHJENlxWte5XygPvfj/MbvtOkWor9zcnHpMMQL2YYaaCcqtIvJUyJ7QVfoGs7ew== @@ -1763,16 +1091,7 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-typescript" "^7.2.0" -"@babel/plugin-transform-unicode-regex@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.0.0.tgz#c6780e5b1863a76fe792d90eded9fcd5b51d68fc" - integrity sha512-uJBrJhBOEa3D033P95nPHu3nbFwFE9ZgXsfEitzoIXIwqAZWk7uXcg06yFKXz9FSxBH5ucgU/cYdX0IV8ldHKw== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-regex" "^7.0.0" - regexpu-core "^4.1.3" - -"@babel/plugin-transform-unicode-regex@^7.4.4": +"@babel/plugin-transform-unicode-regex@^7.0.0", "@babel/plugin-transform-unicode-regex@^7.4.4": version "7.4.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.4.4.tgz#ab4634bb4f14d36728bf5978322b35587787970f" integrity sha512-il+/XdNw01i93+M9J9u4T7/e/Ue/vWfNZE4IRUQjplu2Mqb/AFTDimkw2tdEdSH50wuQXZAbXSql0UphQke+vA== @@ -1924,168 +1243,39 @@ core-js "^2.5.7" regenerator-runtime "^0.12.0" -"@babel/runtime@7.1.2", "@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2": +"@babel/runtime@7.1.2": version "7.1.2" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.1.2.tgz#81c89935f4647706fc54541145e6b4ecfef4b8e3" - integrity sha512-Y3SCjmhSupzFB6wcv1KmmFucH6gDVnI30WjOcicV10ju0cZjak3Jcs67YLIXBrmZYw1xCrVeJPbycFwrqNyxpg== - dependencies: - regenerator-runtime "^0.12.0" - -"@babel/runtime@^7.3.1": - version "7.3.1" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.3.1.tgz#574b03e8e8a9898eaf4a872a92ea20b7846f6f2a" - integrity sha512-7jGW8ppV0ant637pIqAcFfQDDH1orEPGJb8aXfUozuCU3QqX7rX4DA8iwrbPrR1hcH0FTTHz47yQnk+bl5xHQA== - dependencies: - regenerator-runtime "^0.12.0" - -"@babel/runtime@^7.3.4": - version "7.4.2" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.4.2.tgz#f5ab6897320f16decd855eed70b705908a313fe8" - integrity sha512-7Bl2rALb7HpvXFL7TETNzKSAeBVCPHELzc0C//9FCxN8nsiueWSJBqaF+2oIJScyILStASR/Cx5WMkXGYTiJFA== - dependencies: - regenerator-runtime "^0.13.2" - -"@babel/runtime@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.5.5.tgz#74fba56d35efbeca444091c7850ccd494fd2f132" - integrity sha512-28QvEGyQyNkB0/m2B4FU7IEZGK2NUrcMtT6BZEFALTguLk+AUT6ofsHtPk5QyjAdUkpMJ+/Em+quwz4HOt30AQ== - dependencies: - regenerator-runtime "^0.13.2" - -"@babel/runtime@^7.6.0", "@babel/runtime@^7.6.2": - version "7.6.3" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.6.3.tgz#935122c74c73d2240cafd32ddb5fc2a6cd35cf1f" - integrity sha512-kq6anf9JGjW8Nt5rYfEuGRaEAaH1mkv3Bbu6rYvLOpPh/RusSJXuKPEAoZ7L7gybZkchE8+NV5g9vKF4AGAtsA== - dependencies: - regenerator-runtime "^0.13.2" - -"@babel/template@7.1.2", "@babel/template@^7.0.0", "@babel/template@^7.1.0", "@babel/template@^7.1.2": - version "7.1.2" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.1.2.tgz#090484a574fef5a2d2d7726a674eceda5c5b5644" - integrity sha512-SY1MmplssORfFiLDcOETrW7fCLl+PavlwMh92rrGcikQaRq4iWPVH0MpwPpY3etVMx6RnDjXtr6VZYr/IbP/Ag== - dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/parser" "^7.1.2" - "@babel/types" "^7.1.2" - -"@babel/template@^7.2.2": - version "7.2.2" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.2.2.tgz#005b3fdf0ed96e88041330379e0da9a708eb2907" - integrity sha512-zRL0IMM02AUDwghf5LMSSDEz7sBCO2YnNmpg3uWTZj/v1rcG2BmQUvaGU8GhU8BvfMh1k2KIAYZ7Ji9KXPUg7g== - dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/parser" "^7.2.2" - "@babel/types" "^7.2.2" - -"@babel/template@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.4.4.tgz#f4b88d1225689a08f5bc3a17483545be9e4ed237" - integrity sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw== - dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/parser" "^7.4.4" - "@babel/types" "^7.4.4" - -"@babel/template@^7.6.0": - version "7.6.0" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.6.0.tgz#7f0159c7f5012230dad64cca42ec9bdb5c9536e6" - integrity sha512-5AEH2EXD8euCk446b7edmgFdub/qfH1SN6Nii3+fyXP807QRx9Q73A2N5hNwRRslC2H9sNzaFhsPubkS4L8oNQ== - dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/parser" "^7.6.0" - "@babel/types" "^7.6.0" - -"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.1.0.tgz#503ec6669387efd182c3888c4eec07bcc45d91b2" - integrity sha512-bwgln0FsMoxm3pLOgrrnGaXk18sSM9JNf1/nHC/FksmNGFbYnPWY4GYCfLxyP1KRmfsxqkRpfoa6xr6VuuSxdw== - dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/generator" "^7.0.0" - "@babel/helper-function-name" "^7.1.0" - "@babel/helper-split-export-declaration" "^7.0.0" - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - debug "^3.1.0" - globals "^11.1.0" - lodash "^4.17.10" - -"@babel/traverse@^7.1.5": - version "7.1.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.1.5.tgz#5aafca2039aa058c104cf2bfeb9fc4a857ccbca9" - integrity sha512-eU6XokWypl0MVJo+MTSPUtlfPePkrqsF26O+l1qFGlCKWwmiYAYy2Sy44Qw8m2u/LbPCsxYt90rghmqhYMGpPA== - dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/generator" "^7.1.5" - "@babel/helper-function-name" "^7.1.0" - "@babel/helper-split-export-declaration" "^7.0.0" - "@babel/parser" "^7.1.5" - "@babel/types" "^7.1.5" - debug "^3.1.0" - globals "^11.1.0" - lodash "^4.17.10" - -"@babel/traverse@^7.1.6", "@babel/traverse@^7.2.2": - version "7.2.3" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.2.3.tgz#7ff50cefa9c7c0bd2d81231fdac122f3957748d8" - integrity sha512-Z31oUD/fJvEWVR0lNZtfgvVt512ForCTNKYcJBGbPb1QZfve4WGH8Wsy7+Mev33/45fhP/hwQtvgusNdcCMgSw== + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.1.2.tgz#81c89935f4647706fc54541145e6b4ecfef4b8e3" + integrity sha512-Y3SCjmhSupzFB6wcv1KmmFucH6gDVnI30WjOcicV10ju0cZjak3Jcs67YLIXBrmZYw1xCrVeJPbycFwrqNyxpg== dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/generator" "^7.2.2" - "@babel/helper-function-name" "^7.1.0" - "@babel/helper-split-export-declaration" "^7.0.0" - "@babel/parser" "^7.2.3" - "@babel/types" "^7.2.2" - debug "^4.1.0" - globals "^11.1.0" - lodash "^4.17.10" + regenerator-runtime "^0.12.0" -"@babel/traverse@^7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.4.0.tgz#14006967dd1d2b3494cdd650c686db9daf0ddada" - integrity sha512-/DtIHKfyg2bBKnIN+BItaIlEg5pjAnzHOIQe5w+rHAw/rg9g0V7T4rqPX8BJPfW11kt3koyjAnTNwCzb28Y1PA== +"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.3.1", "@babel/runtime@^7.3.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.0", "@babel/runtime@^7.6.2": + version "7.6.3" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.6.3.tgz#935122c74c73d2240cafd32ddb5fc2a6cd35cf1f" + integrity sha512-kq6anf9JGjW8Nt5rYfEuGRaEAaH1mkv3Bbu6rYvLOpPh/RusSJXuKPEAoZ7L7gybZkchE8+NV5g9vKF4AGAtsA== dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/generator" "^7.4.0" - "@babel/helper-function-name" "^7.1.0" - "@babel/helper-split-export-declaration" "^7.4.0" - "@babel/parser" "^7.4.0" - "@babel/types" "^7.4.0" - debug "^4.1.0" - globals "^11.1.0" - lodash "^4.17.11" + regenerator-runtime "^0.13.2" -"@babel/traverse@^7.4.4", "@babel/traverse@^7.4.5": - version "7.4.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.4.5.tgz#4e92d1728fd2f1897dafdd321efbff92156c3216" - integrity sha512-Vc+qjynwkjRmIFGxy0KYoPj4FdVDxLej89kMHFsWScq999uX+pwcX4v9mWRjW0KcAYTPAuVQl2LKP1wEVLsp+A== +"@babel/template@7.1.2": + version "7.1.2" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.1.2.tgz#090484a574fef5a2d2d7726a674eceda5c5b5644" + integrity sha512-SY1MmplssORfFiLDcOETrW7fCLl+PavlwMh92rrGcikQaRq4iWPVH0MpwPpY3etVMx6RnDjXtr6VZYr/IbP/Ag== dependencies: "@babel/code-frame" "^7.0.0" - "@babel/generator" "^7.4.4" - "@babel/helper-function-name" "^7.1.0" - "@babel/helper-split-export-declaration" "^7.4.4" - "@babel/parser" "^7.4.5" - "@babel/types" "^7.4.4" - debug "^4.1.0" - globals "^11.1.0" - lodash "^4.17.11" + "@babel/parser" "^7.1.2" + "@babel/types" "^7.1.2" -"@babel/traverse@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.5.5.tgz#f664f8f368ed32988cd648da9f72d5ca70f165bb" - integrity sha512-MqB0782whsfffYfSjH4TM+LMjrJnhCNEDMDIjeTpl+ASaUvxcjoiVCo/sM1GhS1pHOXYfWVCYneLjMckuUxDaQ== +"@babel/template@^7.0.0", "@babel/template@^7.1.0", "@babel/template@^7.1.2", "@babel/template@^7.4.4", "@babel/template@^7.6.0": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.6.0.tgz#7f0159c7f5012230dad64cca42ec9bdb5c9536e6" + integrity sha512-5AEH2EXD8euCk446b7edmgFdub/qfH1SN6Nii3+fyXP807QRx9Q73A2N5hNwRRslC2H9sNzaFhsPubkS4L8oNQ== dependencies: - "@babel/code-frame" "^7.5.5" - "@babel/generator" "^7.5.5" - "@babel/helper-function-name" "^7.1.0" - "@babel/helper-split-export-declaration" "^7.4.4" - "@babel/parser" "^7.5.5" - "@babel/types" "^7.5.5" - debug "^4.1.0" - globals "^11.1.0" - lodash "^4.17.13" + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.6.0" + "@babel/types" "^7.6.0" -"@babel/traverse@^7.6.2", "@babel/traverse@^7.6.3": +"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.1.6", "@babel/traverse@^7.4.4", "@babel/traverse@^7.5.5", "@babel/traverse@^7.6.2", "@babel/traverse@^7.6.3": version "7.6.3" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.6.3.tgz#66d7dba146b086703c0fb10dd588b7364cec47f9" integrity sha512-unn7P4LGsijIxaAJo/wpoU11zN+2IaClkQAxcJWBNCMS6cmVh802IyLHNkAjQ0iYnRS3nnxk5O3fuXW28IMxTw== @@ -2100,70 +1290,7 @@ globals "^11.1.0" lodash "^4.17.13" -"@babel/types@^7.0.0", "@babel/types@^7.1.2": - version "7.1.2" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.1.2.tgz#183e7952cf6691628afdc2e2b90d03240bac80c0" - integrity sha512-pb1I05sZEKiSlMUV9UReaqsCPUpgbHHHu2n1piRm7JkuBkm6QxcaIzKu6FMnMtCbih/cEYTR+RGYYC96Yk9HAg== - dependencies: - esutils "^2.0.2" - lodash "^4.17.10" - to-fast-properties "^2.0.0" - -"@babel/types@^7.1.5": - version "7.1.5" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.1.5.tgz#12fe64e91a431234b7017b4227a78cc0eec4e081" - integrity sha512-sJeqa/d9eM/bax8Ivg+fXF7FpN3E/ZmTrWbkk6r+g7biVYfALMnLin4dKijsaqEhpd2xvOGfQTkQkD31YCVV4A== - dependencies: - esutils "^2.0.2" - lodash "^4.17.10" - to-fast-properties "^2.0.0" - -"@babel/types@^7.2.0", "@babel/types@^7.2.2": - version "7.2.2" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.2.2.tgz#44e10fc24e33af524488b716cdaee5360ea8ed1e" - integrity sha512-fKCuD6UFUMkR541eDWL+2ih/xFZBXPOg/7EQFeTluMDebfqR4jrpaCjLhkWlQS4hT6nRa2PMEgXKbRB5/H2fpg== - dependencies: - esutils "^2.0.2" - lodash "^4.17.10" - to-fast-properties "^2.0.0" - -"@babel/types@^7.3.0": - version "7.3.4" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.3.4.tgz#bf482eaeaffb367a28abbf9357a94963235d90ed" - integrity sha512-WEkp8MsLftM7O/ty580wAmZzN1nDmCACc5+jFzUt+GUFNNIi3LdRlueYz0YIlmJhlZx1QYDMZL5vdWCL0fNjFQ== - dependencies: - esutils "^2.0.2" - lodash "^4.17.11" - to-fast-properties "^2.0.0" - -"@babel/types@^7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.4.0.tgz#670724f77d24cce6cc7d8cf64599d511d164894c" - integrity sha512-aPvkXyU2SPOnztlgo8n9cEiXW755mgyvueUPcpStqdzoSPm0fjO0vQBjLkt3JKJW7ufikfcnMTTPsN1xaTsBPA== - dependencies: - esutils "^2.0.2" - lodash "^4.17.11" - to-fast-properties "^2.0.0" - -"@babel/types@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.4.4.tgz#8db9e9a629bb7c29370009b4b779ed93fe57d5f0" - integrity sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ== - dependencies: - esutils "^2.0.2" - lodash "^4.17.11" - to-fast-properties "^2.0.0" - -"@babel/types@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.5.5.tgz#97b9f728e182785909aa4ab56264f090a028d18a" - integrity sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw== - dependencies: - esutils "^2.0.2" - lodash "^4.17.13" - to-fast-properties "^2.0.0" - -"@babel/types@^7.6.0", "@babel/types@^7.6.3": +"@babel/types@^7.0.0", "@babel/types@^7.1.2", "@babel/types@^7.2.0", "@babel/types@^7.3.0", "@babel/types@^7.4.4", "@babel/types@^7.5.5", "@babel/types@^7.6.0", "@babel/types@^7.6.3": version "7.6.3" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.6.3.tgz#3f07d96f854f98e2fbd45c64b0cb942d11e8ba09" integrity sha512-CqbcpTxMcpuQTMhjI37ZHVgjBkysg5icREQIEZ0eG1yCNwg3oy+5AaLiOKmjsCj6nqOsa6Hf0ObjRVwokb7srA== @@ -2599,23 +1726,6 @@ retry-request "^4.0.0" teeny-request "^5.2.1" -"@google-cloud/common@^0.27.0": - version "0.27.0" - resolved "https://registry.yarnpkg.com/@google-cloud/common/-/common-0.27.0.tgz#31dbd52d7472f2606df05b194887db2b595bdad5" - integrity sha512-lRA3RHjMNQODpobcHLK9qg4ebN+jjUl7y4ZbjHFM+FYzmZLJQL1LFCM0BJ1DAPyD14ScBZ8Zb2I48oOFVxfNvQ== - dependencies: - "@google-cloud/projectify" "^0.3.2" - "@google-cloud/promisify" "^0.3.0" - "@types/duplexify" "^3.5.0" - "@types/request" "^2.47.0" - arrify "^1.0.1" - duplexify "^3.6.0" - ent "^2.2.0" - extend "^3.0.1" - google-auth-library "^2.0.0" - pify "^4.0.0" - retry-request "^4.0.0" - "@google-cloud/common@^0.31.0": version "0.31.0" resolved "https://registry.yarnpkg.com/@google-cloud/common/-/common-0.31.0.tgz#51a82d681043e2718bd32708586d3131b019d7a8" @@ -2713,17 +1823,6 @@ yargs "^12.0.1" yargs-parser "10.1.0" -"@google-cloud/paginator@^0.1.0": - version "0.1.2" - resolved "https://registry.yarnpkg.com/@google-cloud/paginator/-/paginator-0.1.2.tgz#a7e6579e43f153055b4c65035a6729490a611a60" - integrity sha512-XL09cuPSEPyyNifavxWJRYkUFr5zCJ9njcFjqc1AqSQ2QIKycwdTxOP/zHsAWj0xN3rw1ApevA8o+8VAD4R6hw== - dependencies: - arrify "^1.0.1" - extend "^3.0.1" - is "^3.2.1" - split-array-stream "^2.0.0" - stream-events "^1.0.4" - "@google-cloud/paginator@^0.2.0": version "0.2.0" resolved "https://registry.yarnpkg.com/@google-cloud/paginator/-/paginator-0.2.0.tgz#eab2e6aa4b81df7418f6c51e2071f64dab2c2fa5" @@ -2747,12 +1846,7 @@ resolved "https://registry.yarnpkg.com/@google-cloud/precise-date/-/precise-date-0.1.0.tgz#02ccda04b4413fa64f098fc93db51e95af5c855a" integrity sha512-nXt4AskYjmDLRIO+nquVVppjiLE5ficFRP3WF1JYtPnSRFRpuMusa1kysPsD/yOxt5NMmvlkUCkaFI4rHYeckQ== -"@google-cloud/projectify@^0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@google-cloud/projectify/-/projectify-0.3.0.tgz#adb984ac61f7ec855558ef677621b2488c50d05d" - integrity sha512-ic3vU+rBLlQ9rU6vyMcQ/GoYQX9hP0P56jdbnSkGvXrVnO1DtYrkPV3Qg/NUrpAfKnmNC4hb0O/v2hCj8uGnbQ== - -"@google-cloud/projectify@^0.3.2": +"@google-cloud/projectify@^0.3.0", "@google-cloud/projectify@^0.3.2": version "0.3.2" resolved "https://registry.yarnpkg.com/@google-cloud/projectify/-/projectify-0.3.2.tgz#ed54c98cae646dc03a742eac288184a13d33a4c2" integrity sha512-t1bs5gE105IpgikX7zPCJZzVyXM5xZ/1kJomUPim2E2pNp4OUUFNyvKm/T2aM6GBP2F30o8abCD+/wbOhHWYYA== @@ -2801,33 +1895,7 @@ p-defer "^1.0.0" protobufjs "^6.8.1" -"@google-cloud/storage@^2.3.3": - version "2.3.3" - resolved "https://registry.yarnpkg.com/@google-cloud/storage/-/storage-2.3.3.tgz#e4e68056f734361ede3bf81233de89f2d3751673" - integrity sha512-CW5LvzompZqkXTEWNsr4yke/XD2mYvZeoVahehwSkqp9BY/EPIKvHrlJpRn2pNiZHKH3QsXdNr2GJHVdw/NMPg== - dependencies: - "@google-cloud/common" "^0.27.0" - "@google-cloud/paginator" "^0.1.0" - "@google-cloud/promisify" "^0.3.0" - arrify "^1.0.0" - async "^2.0.1" - compressible "^2.0.12" - concat-stream "^1.5.0" - duplexify "^3.5.0" - extend "^3.0.0" - gcs-resumable-upload "^0.13.0" - hash-stream-validation "^0.2.1" - mime "^2.2.0" - mime-types "^2.0.8" - once "^1.3.1" - pumpify "^1.5.1" - snakeize "^0.1.0" - stream-events "^1.0.1" - teeny-request "^3.11.3" - through2 "^3.0.0" - xdg-basedir "^3.0.0" - -"@google-cloud/storage@^2.4.3": +"@google-cloud/storage@^2.3.3", "@google-cloud/storage@^2.4.3": version "2.4.3" resolved "https://registry.yarnpkg.com/@google-cloud/storage/-/storage-2.4.3.tgz#d52a1937f3ea0ad3e13e947fab6154c76ab0d4ca" integrity sha512-Ol0Ed1zYNYixq+wPPaFNIVjT5+KJldBI6vyRDXnrAu5Yu66PU4iMJvEztUVfckz6vsihwApBMeXxdDUyJzMM2w== @@ -2903,15 +1971,7 @@ lodash.camelcase "^4.3.0" protobufjs "^6.8.6" -"@grpc/proto-loader@^0.5.0": - version "0.5.1" - resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.5.1.tgz#48492b53cdda353110b51a4b02f465974729c76f" - integrity sha512-3y0FhacYAwWvyXshH18eDkUI40wT/uGio7MAegzY8lO5+wVsc19+1A7T0pPptae4kl7bdITL+0cHpnAPmryBjQ== - dependencies: - lodash.camelcase "^4.3.0" - protobufjs "^6.8.6" - -"@grpc/proto-loader@^0.5.1": +"@grpc/proto-loader@^0.5.0", "@grpc/proto-loader@^0.5.1": version "0.5.2" resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.5.2.tgz#c84f83be962f518bc303ca2d5e6ef2239439786c" integrity sha512-eBKD/FPxQoY1x6QONW2nBd54QUEyzcFP9FenujmoeDPy1rutVSHki1s/wR68F6O1QfCNDx+ayBH1O2CVNMzyyw== @@ -2951,16 +2011,7 @@ dependencies: "@hapi/hoek" "8.x.x" -"@jest/console@^24.7.1": - version "24.7.1" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-24.7.1.tgz#32a9e42535a97aedfe037e725bd67e954b459545" - integrity sha512-iNhtIy2M8bXlAOULWVTUxmnelTLFneTNEkHCgPmgd+zNwy9zVddJ6oS5rZ9iwoscNdT5mMwUd0C51v/fSlzItg== - dependencies: - "@jest/source-map" "^24.3.0" - chalk "^2.0.1" - slash "^2.0.0" - -"@jest/console@^24.9.0": +"@jest/console@^24.7.1", "@jest/console@^24.9.0": version "24.9.0" resolved "https://registry.yarnpkg.com/@jest/console/-/console-24.9.0.tgz#79b1bc06fb74a8cfb01cbdedf945584b1b9707f0" integrity sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ== @@ -3049,16 +2100,7 @@ source-map "^0.6.0" string-length "^2.0.0" -"@jest/source-map@^24.3.0": - version "24.3.0" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-24.3.0.tgz#563be3aa4d224caf65ff77edc95cd1ca4da67f28" - integrity sha512-zALZt1t2ou8le/crCeeiRYzvdnTzaIlpOWaet45lNSqNJUnXbppUUFR4ZUAlzgDmKee4Q5P/tKXypI1RiHwgag== - dependencies: - callsites "^3.0.0" - graceful-fs "^4.1.15" - source-map "^0.6.0" - -"@jest/source-map@^24.9.0": +"@jest/source-map@^24.3.0", "@jest/source-map@^24.9.0": version "24.9.0" resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-24.9.0.tgz#0e263a94430be4b41da683ccc1e6bffe2a191714" integrity sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg== @@ -3897,15 +2939,7 @@ debug "^4.1.1" semver "^5.6.0" -"@oclif/config@^1": - version "1.13.0" - resolved "https://registry.yarnpkg.com/@oclif/config/-/config-1.13.0.tgz#fc2bd82a9cb30a73faf7d2aa5ae937c719492bd1" - integrity sha512-ttb4l85q7SBx+WlUJY4A9eXLgv4i7hGDNGaXnY9fDKrYD7PBMwNOQ3Ssn2YT2yARAjyOxVE/5LfcwhQGq4kzqg== - dependencies: - debug "^4.1.1" - tslib "^1.9.3" - -"@oclif/config@^1.12.12": +"@oclif/config@^1", "@oclif/config@^1.12.12": version "1.13.2" resolved "https://registry.yarnpkg.com/@oclif/config/-/config-1.13.2.tgz#c1dc25296bf06c039fd5fb0b90e4132be2213b2a" integrity sha512-RUOKeuAaopo3zrA5hcgE0PT2lbAUT72+eJdqTlWyI9sbPrGHZgUwV+vrL6Qal7ywWYDkL0vrKd1YS4yXtKIDKw== @@ -3930,16 +2964,7 @@ resolved "https://registry.yarnpkg.com/@oclif/linewrap/-/linewrap-1.0.0.tgz#aedcb64b479d4db7be24196384897b5000901d91" integrity sha512-Ups2dShK52xXa8w6iBWLgcjPJWjais6KPJQq3gQ/88AY6BXoTX+MIGFPrWQO1KLMiQfoTpcLnUwloN4brrVUHw== -"@oclif/parser@^3.7.3": - version "3.8.1" - resolved "https://registry.yarnpkg.com/@oclif/parser/-/parser-3.8.1.tgz#3c842ef4a8ce3d1f5bcfa5938d3fbebf1c6a0618" - integrity sha512-0OavFuLj6FBTdZDD6DXdNqH4qdLFLQD/PKK1OvNZhUd4/5v/lp6Ftzilwmirf549naNHq0u15uk1YCBvym5tNQ== - dependencies: - "@oclif/linewrap" "^1.0.0" - chalk "^2.4.2" - tslib "^1.9.3" - -"@oclif/parser@^3.8.0": +"@oclif/parser@^3.7.3", "@oclif/parser@^3.8.0": version "3.8.3" resolved "https://registry.yarnpkg.com/@oclif/parser/-/parser-3.8.3.tgz#717fbbe5bfafef4270224b8bd41a2d3c80b9554e" integrity sha512-zN+3oGuv9Lg8NjFvxZTDKFEmhAMfAvd/JWeQp3Ri8pDezoyJQi4OSHHLM8sdHjBh8sePewfWI7+fDUXdrVbrqg== @@ -4280,17 +3305,7 @@ dependencies: jstz "^2.0.0" -"@sentry/browser@^5.6.2": - version "5.6.2" - resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-5.6.2.tgz#f39e95c3aff2d4b4fd5d0d4aa7192af73f20d24e" - integrity sha512-Nm/W/5ra6+OQCWQkdd86vHjcYUjHCVqCzQyPasd6HE7SNlWe5euGVfFfDuUFsiDrMAG5uKfGYw5u/AqoweiQkQ== - dependencies: - "@sentry/core" "5.6.2" - "@sentry/types" "5.6.1" - "@sentry/utils" "5.6.1" - tslib "^1.9.3" - -"@sentry/browser@^5.6.3": +"@sentry/browser@^5.6.2", "@sentry/browser@^5.6.3": version "5.6.3" resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-5.6.3.tgz#5cc37b0443eba55ad13c13d34d6b95ff30dfbfe3" integrity sha512-bP1LTbcKPOkkmfJOAM6c7WZ0Ov0ZEW6B9keVZ9wH9fw/lBPd9UyDMDCwJ+FAYKz9M9S5pxQeJ4Ebd7WUUrGVAQ== @@ -4674,14 +3689,7 @@ dependencies: "@types/node" "*" -"@types/bn.js@*", "@types/bn.js@^4.11.0": - version "4.11.0" - resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.0.tgz#401cb20874f0a7b8414e46308a99c449759b7de9" - integrity sha512-T/KbioxKE9JM4I91eTx977QEEla3rlD0etJqWL3uQhmZFrYmRoFGJcA68EIXG6Eyupu6eLj8V1cMwBUxwmtstQ== - dependencies: - "@types/node" "*" - -"@types/bn.js@^4.11.4": +"@types/bn.js@*", "@types/bn.js@^4.11.0", "@types/bn.js@^4.11.4": version "4.11.4" resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.4.tgz#a7bed5bdef9f16b25c92ba27745ab261374787d7" integrity sha512-AO8WW+aRcKWKQAYTfKLzwnpL6U+TfPqS+haRrhCy5ff04Da8WZud3ZgVjspQXaEXJDcTlsjUEVvL39wegDek5w== @@ -4716,12 +3724,7 @@ resolved "https://registry.yarnpkg.com/@types/caseless/-/caseless-0.12.1.tgz#9794c69c8385d0192acc471a540d1f8e0d16218a" integrity sha512-FhlMa34NHp9K5MY1Uz8yb+ZvuX0pnvn3jScRSNAb75KHGB8d3rEU6hqMs3Z2vjuytcMfRg6c5CHMc3wtYyD2/A== -"@types/chai@^4.1.3": - version "4.1.3" - resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.1.3.tgz#b8a74352977a23b604c01aa784f5b793443fb7dc" - integrity sha512-f5dXGzOJycyzSMdaXVhiBhauL4dYydXwVpavfQ1mVCaGjR56a9QfklXObUxlIY9bGTmCPHEEZ04I16BZ/8w5ww== - -"@types/chai@^4.1.4": +"@types/chai@^4.1.3", "@types/chai@^4.1.4": version "4.1.7" resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.1.7.tgz#1b8e33b61a8c09cbe1f85133071baa0dbf9fa71a" integrity sha512-2Y8uPt0/jwjhQ6EiluT0XCri1Dbplr0ZxfFXUz+ye13gaqE8u5gL5ppao1JrUYr9cIip5S6MvQzBS7Kke7U9VA== @@ -4767,12 +3770,7 @@ resolved "https://registry.yarnpkg.com/@types/country-data/-/country-data-0.0.0.tgz#6f5563cae3d148780c5b6539803a29bd93f8f1a1" integrity sha512-lIxCk6G7AwmUagQ4gIQGxUBnvAq664prFD9nSAz6dgd1XmBXBtZABV/op+QsJsIyaP1GZsf/iXhYKHX3azSRCw== -"@types/debug@^4.1.4": - version "4.1.4" - resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.4.tgz#56eec47706f0fd0b7c694eae2f3172e6b0b769da" - integrity sha512-D9MyoQFI7iP5VdpEyPZyjjqIJ8Y8EDNQFIFVLOmeg1rI1xiHOChyUPMPRUVfqFCerxfE+yS3vMyj37F6IdtOoQ== - -"@types/debug@^4.1.5": +"@types/debug@^4.1.4", "@types/debug@^4.1.5": version "4.1.5" resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.5.tgz#b14efa8852b7768d898906613c23f688713e02cd" integrity sha512-Q1y515GcOdTHgagaVFhHnIFQ38ygs/kmxdNpvpou+raI9UO3YZcHDngBSYKQklcKlvA7iuQlmIKbzvmxcOE9CQ== @@ -4798,24 +3796,17 @@ dependencies: "@types/bn.js" "*" -"@types/enzyme-adapter-react-16@1.0.4": +"@types/enzyme-adapter-react-16@1.0.4", "@types/enzyme-adapter-react-16@^1.0.3": version "1.0.4" resolved "https://registry.yarnpkg.com/@types/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.0.4.tgz#27722d28dcc814a99be7f557f3e364a1e889773a" integrity sha512-SWCatt3aKVL0A8JACs2nkV9dDuTZOSOSlNVubcxfEe+YLePxg8Be2slSa5gl+WM/BUW0/c3UClvyzhnzLJh1IQ== dependencies: "@types/enzyme" "*" -"@types/enzyme-adapter-react-16@^1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@types/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.0.3.tgz#0cf7025b036694ca8d596fe38f24162e7117acf1" - integrity sha512-9eRLBsC/Djkys05BdTWgav8v6fSCjyzjNuLwG2sfa2b2g/VAN10luP0zB0VwtOWFQ0LGjIboJJvIsVdU5gqRmg== - dependencies: - "@types/enzyme" "*" - -"@types/enzyme@*": - version "3.1.13" - resolved "https://registry.yarnpkg.com/@types/enzyme/-/enzyme-3.1.13.tgz#4bbc5c81fa40c9fc7efee25c4a23cb37119a33ea" - integrity sha512-TwzKKiX5sGh/WweucxPXb8zjMLlLekGtBQw0ihk1HSj14zZuioG3Gql3jbxxb1YDRLbT4WQyzWG/h4Y7eCdw1g== +"@types/enzyme@*", "@types/enzyme@^3.1.15", "@types/enzyme@^3.9.1": + version "3.9.1" + resolved "https://registry.yarnpkg.com/@types/enzyme/-/enzyme-3.9.1.tgz#3a0ce07e30066dbc26cd3474c8e680af2d249e26" + integrity sha512-CasnOP73BFE3/5JvGkod+oQtGOD1+CVWz9BV2iAqDFJ+sofL5gTiizSr8ZM3lpDY27ptC8yjAdrUCdv8diKKqw== dependencies: "@types/cheerio" "*" "@types/react" "*" @@ -4828,22 +3819,6 @@ "@types/cheerio" "*" "@types/react" "*" -"@types/enzyme@^3.1.15": - version "3.1.15" - resolved "https://registry.yarnpkg.com/@types/enzyme/-/enzyme-3.1.15.tgz#fc9a9695ba9f90cd50c4967e64a8c66ec96913d1" - integrity sha512-6b4JWgV+FNec1c4+8HauGbXg5gRc1oQK93t2+4W+bHjG/PzO+iPvagY6d6bXAZ+t+ps51Zb2F9LQ4vl0S0Epog== - dependencies: - "@types/cheerio" "*" - "@types/react" "*" - -"@types/enzyme@^3.9.1": - version "3.9.1" - resolved "https://registry.yarnpkg.com/@types/enzyme/-/enzyme-3.9.1.tgz#3a0ce07e30066dbc26cd3474c8e680af2d249e26" - integrity sha512-CasnOP73BFE3/5JvGkod+oQtGOD1+CVWz9BV2iAqDFJ+sofL5gTiizSr8ZM3lpDY27ptC8yjAdrUCdv8diKKqw== - dependencies: - "@types/cheerio" "*" - "@types/react" "*" - "@types/eslint-visitor-keys@^1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d" @@ -4891,16 +3866,16 @@ "@types/events" "*" "@types/node" "*" -"@types/express@*", "@types/express@^4.11.1": - version "4.11.1" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.11.1.tgz#f99663b3ab32d04cb11db612ef5dd7933f75465b" - integrity sha512-ttWle8cnPA5rAelauSWeWJimtY2RsUf2aspYZs7xPHiWgOlPn6nnUfBMtrkcnjFJuIHJF4gNOdVvpLK2Zmvh6g== +"@types/express@*", "@types/express@^4.11.1", "@types/express@^4.16.1", "@types/express@^4.17.0": + version "4.17.1" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.1.tgz#4cf7849ae3b47125a567dfee18bfca4254b88c5c" + integrity sha512-VfH/XCP0QbQk5B5puLqTLEeFgR8lfCJHZJKkInZ9mkYd+u8byX0kztXEQxEk4wZXJs8HI+7km2ALXjn4YKcX9w== dependencies: "@types/body-parser" "*" "@types/express-serve-static-core" "*" "@types/serve-static" "*" -"@types/express@4.16.1", "@types/express@^4.16.1": +"@types/express@4.16.1": version "4.16.1" resolved "https://registry.yarnpkg.com/@types/express/-/express-4.16.1.tgz#d756bd1a85c34d87eaf44c888bad27ba8a4b7cf0" integrity sha512-V0clmJow23WeyblmACoxbHBu2JKlE5TiIme6Lem14FnPW9gsttyHtk6wq7njcdIWH1njAaFgR8gW09lgY98gQg== @@ -4918,15 +3893,6 @@ "@types/express-serve-static-core" "*" "@types/serve-static" "*" -"@types/express@^4.17.0": - version "4.17.1" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.1.tgz#4cf7849ae3b47125a567dfee18bfca4254b88c5c" - integrity sha512-VfH/XCP0QbQk5B5puLqTLEeFgR8lfCJHZJKkInZ9mkYd+u8byX0kztXEQxEk4wZXJs8HI+7km2ALXjn4YKcX9w== - dependencies: - "@types/body-parser" "*" - "@types/express-serve-static-core" "*" - "@types/serve-static" "*" - "@types/fbemitter@^2.0.32": version "2.0.32" resolved "https://registry.yarnpkg.com/@types/fbemitter/-/fbemitter-2.0.32.tgz#8ed204da0f54e9c8eaec31b1eec91e25132d082c" @@ -5071,26 +4037,16 @@ dependencies: "@types/lodash" "*" -"@types/lodash@*", "@types/lodash@^4.14.136": +"@types/lodash@*", "@types/lodash@^4.14.104", "@types/lodash@^4.14.136": version "4.14.136" resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.136.tgz#413e85089046b865d960c9ff1d400e04c31ab60f" integrity sha512-0GJhzBdvsW2RUccNHOBkabI8HZVdOXmXbXhuKlDEd5Vv12P7oAVGfomGp3Ne21o5D/qu1WmthlNKFaoZJJeErA== -"@types/lodash@^4.14.104": - version "4.14.117" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.117.tgz#695a7f514182771a1e0f4345d189052ee33c8778" - integrity sha512-xyf2m6tRbz8qQKcxYZa7PA4SllYcay+eh25DN3jmNYY6gSTL7Htc/bttVdkqj2wfJGbeWlQiX8pIyJpKU+tubw== - "@types/long@*", "@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/long@^3.0.32": - version "3.0.32" - resolved "https://registry.yarnpkg.com/@types/long/-/long-3.0.32.tgz#f4e5af31e9e9b196d8e5fca8a5e2e20aa3d60b69" - integrity sha512-ZXyOOm83p7X8p3s0IYM3VeueNmHpkk/yMlP8CLeOnEcu6hIwPH7YjZBvhQkR0ZFS2DqZAxKtJ/M5fcuv3OU5BA== - "@types/mailgun-js@^0.16.3": version "0.16.3" resolved "https://registry.yarnpkg.com/@types/mailgun-js/-/mailgun-js-0.16.3.tgz#655fade2c72c430a7a248d84839f8adc2c400e62" @@ -5127,17 +4083,7 @@ dependencies: "@types/node" "*" -"@types/mocha@^5.2.1": - version "5.2.5" - resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-5.2.5.tgz#8a4accfc403c124a0bafe8a9fc61a05ec1032073" - integrity sha512-lAVp+Kj54ui/vLUFxsJTMtWvZraZxum3w3Nwkble2dNuV5VnPA+Mi2oGX9XYJAaIvZi3tn3cbjS/qcJXRb6Bww== - -"@types/mocha@^5.2.5": - version "5.2.6" - resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-5.2.6.tgz#b8622d50557dd155e9f2f634b7d68fd38de5e94b" - integrity sha512-1axi39YdtBI7z957vdqXI4Ac25e7YihYQtJa+Clnxg1zTJEaIRbndt71O3sP4GAMgiAm0pY26/b9BrY4MR/PMw== - -"@types/mocha@^5.2.7": +"@types/mocha@^5.2.1", "@types/mocha@^5.2.5", "@types/mocha@^5.2.7": version "5.2.7" resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-5.2.7.tgz#315d570ccb56c53452ff8638738df60726d5b6ea" integrity sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ== @@ -5161,75 +4107,33 @@ "@types/node-fetch" "*" "@types/react" "*" -"@types/node-fetch@*": +"@types/node-fetch@*", "@types/node-fetch@^2.1.2": version "2.1.4" resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.1.4.tgz#093d1beae11541aef25999d70aa09286fd025b1a" integrity sha512-tR1ekaXUGpmzOcDXWU9BW73YfA2/VW1DF1FH+wlJ82BbCSnWTbdX+JkqWQXWKIGsFPnPsYadbXfNgz28g+ccWg== dependencies: "@types/node" "*" -"@types/node-fetch@^2.1.2": - version "2.1.2" - resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.1.2.tgz#8c5da14d70321e4c4ecd5db668e3f93cf6c7399f" - integrity sha512-XroxUzLpKuL+CVkQqXlffRkEPi4Gh3Oui/mWyS7ztKiyqVxiU+h3imCW5I2NQmde5jK+3q++36/Q96cyRWsweg== - dependencies: - "@types/node" "*" - -"@types/node@*": - version "10.0.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-10.0.0.tgz#c40f8e07dce607d3ef25a626b93a6a7cdcf97881" - integrity sha512-kctoM36XiNZT86a7tPsUje+Q/yl+dqELjtYApi0T5eOQ90Elhu0MI10rmYk44yEP4v1jdDvtjQ9DFtpRtHf2Bw== - -"@types/node@^10": - version "10.14.10" - resolved "https://registry.yarnpkg.com/@types/node/-/node-10.14.10.tgz#e491484c6060af8d461e12ec81c0da8a3282b8de" - integrity sha512-V8wj+w2YMNvGuhgl/MA5fmTxgjmVHVoasfIaxMMZJV6Y8Kk+Ydpi1z2whoShDCJ2BuNVoqH/h1hrygnBxkrw/Q== - -"@types/node@^10.1.0": - version "10.11.6" - resolved "https://registry.yarnpkg.com/@types/node/-/node-10.11.6.tgz#ce5690df6cd917a9178439a1013e39a7e565c46e" - integrity sha512-fnA7yvqg3oKQDb3skBif9w5RRKVKAaeKeNuLzZL37XcSiWL4IoSXQnnbchR3UnBu2EMLHBip7ZVEkqoIVBP8QQ== - -"@types/node@^10.12.18": - version "10.12.18" - resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.18.tgz#1d3ca764718915584fcd9f6344621b7672665c67" - integrity sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ== - -"@types/node@^10.3.2": - version "10.12.26" - resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.26.tgz#2dec19f1f7981c95cb54bab8f618ecb5dc983d0e" - integrity sha512-nMRqS+mL1TOnIJrL6LKJcNZPB8V3eTfRo9FQA2b5gDvrHurC8XbSA86KNe0dShlEL7ReWJv/OU9NL7Z0dnqWTg== - -"@types/node@^12.11.7": +"@types/node@*", "@types/node@^12.11.7": version "12.11.7" resolved "https://registry.yarnpkg.com/@types/node/-/node-12.11.7.tgz#57682a9771a3f7b09c2497f28129a0462966524a" integrity sha512-JNbGaHFCLwgHn/iCckiGSOZ1XYHsKFwREtzPwSGCVld1SGhOlmZw2D4ZI94HQCrBHbADzW9m4LER/8olJTRGHA== -"@types/node@^6.0.52": - version "6.14.6" - resolved "https://registry.yarnpkg.com/@types/node/-/node-6.14.6.tgz#31df045b4c7618ff74d84f542fc3d29445dd566b" - integrity sha512-rFs9zCFtSHuseiNXxYxFlun8ibu+jtZPgRM+2ILCmeLiGeGLiIGxuOzD+cNyHegI1GD+da3R/cIbs9+xCLp13w== +"@types/node@^10", "@types/node@^10.1.0", "@types/node@^10.12.18", "@types/node@^10.3.2": + version "10.14.10" + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.14.10.tgz#e491484c6060af8d461e12ec81c0da8a3282b8de" + integrity sha512-V8wj+w2YMNvGuhgl/MA5fmTxgjmVHVoasfIaxMMZJV6Y8Kk+Ydpi1z2whoShDCJ2BuNVoqH/h1hrygnBxkrw/Q== -"@types/node@^6.14.4": +"@types/node@^6.0.52", "@types/node@^6.14.4": version "6.14.7" resolved "https://registry.yarnpkg.com/@types/node/-/node-6.14.7.tgz#2173f79d7a61d97d3aad2feeaac7ac69a3df39af" integrity sha512-YbPXbaynBTe0pVExPhL76TsWnxSPeFAvImIsmylpBWn/yfw+lHy+Q68aawvZHsgskT44ZAoeE67GM5f+Brekew== -"@types/node@^8.0.0", "@types/node@^8.0.53": - version "8.10.10" - resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.10.tgz#fec07bc2ad549d9e6d2f7aa0fb0be3491b83163a" - integrity sha512-p3W/hFzQs76RlYRIZsZc5a9bht6m0TspmWYYbKhRswmLnwj9fsE40EbuGifeu/XWR/c0UJQ1DDbvTxIsm/OOAA== - -"@types/node@^8.0.24", "@types/node@^8.0.7": +"@types/node@^8.0.0", "@types/node@^8.0.24", "@types/node@^8.0.53", "@types/node@^8.0.7": version "8.10.40" resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.40.tgz#4314888d5cd537945d73e9ce165c04cc550144a4" integrity sha512-RRSjdwz63kS4u7edIwJUn8NqKLLQ6LyqF/X4+4jp38MBT3Vwetewi2N4dgJEshLbDwNgOJXNYoOwzVZUSSLhkQ== -"@types/node@^8.9.4": - version "8.10.12" - resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.12.tgz#dcb66f6de39074a296534bd1a256a3c6a1c8f5b5" - integrity sha512-aRFUGj/f9JVA0qSQiCK9ebaa778mmqMIcy1eKnPktgfm9O6VsnIzzB5wJnjp9/jVrfm7fX1rr3OR1nndppGZUg== - "@types/node@^9.3.0", "@types/node@^9.4.1": version "9.6.7" resolved "https://registry.yarnpkg.com/@types/node/-/node-9.6.7.tgz#5f3816d1db2155edcde1b2e3aa5d0e5c520cb564" @@ -5278,12 +4182,7 @@ resolved "https://registry.yarnpkg.com/@types/q/-/q-0.0.37.tgz#7d6a934b35ee2f0ed0646d286eba559599021c9e" integrity sha512-vjFGX1zMTMz/kUp3xgfJcxMVLkMWVMrdlyc0RwVyve1y9jxwqNaT8wTcv6M51ylq2a/zn5lm8g7qPSoIS4uvZQ== -"@types/qs@^6.2.31": - version "6.5.1" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.5.1.tgz#a38f69c62528d56ba7bd1f91335a8004988d72f7" - integrity sha512-mNhVdZHdtKHMMxbqzNK3RzkBcN1cux3AvuCYGTvjEIQT2uheH3eCAyYsbMbh2Bq8nXkeOWs1kyDiF7geWRFQ4Q== - -"@types/qs@^6.5.1": +"@types/qs@^6.2.31", "@types/qs@^6.5.1": version "6.5.3" resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.5.3.tgz#1c3b71b091eaeaf5924538006b7f70603ce63d38" integrity sha512-Jugo5V/1bS0fRhy2z8+cUAHEyWOATaz4rbyLVvcFs7+dXp5HfwpEwzF1Q11bB10ApUqHf+yTauxI0UXQDwGrbA== @@ -5345,14 +4244,7 @@ "@types/react" "*" "@types/react-native" "*" -"@types/react-native@*": - version "0.55.8" - resolved "https://registry.yarnpkg.com/@types/react-native/-/react-native-0.55.8.tgz#31a6b42852088742e7464876742081a2c1ef3fe7" - integrity sha512-Dd8mzEOffbHzrLuNNmodhJzdgnG7V80NGw+nnG560+RmPsQVGcsh9sYOo085jES3wImmOU5aUWSohh0Fv1Ne8Q== - dependencies: - "@types/react" "*" - -"@types/react-native@^0.60.19": +"@types/react-native@*", "@types/react-native@^0.60.19": version "0.60.19" resolved "https://registry.yarnpkg.com/@types/react-native/-/react-native-0.60.19.tgz#4d58516f9e981c3f477ad48727331e31a0792aae" integrity sha512-1Qq1EQn/bi7dnsdrZJu0f9MK18KZrEmLGMfw3V9Im5As4uwFUTCIkD4LnFJkfQtRvtJQN1cOQri6MTqT7d9fkg== @@ -5481,16 +4373,11 @@ dependencies: source-map "^0.6.1" -"@types/underscore@*": +"@types/underscore@*", "@types/underscore@^1.8.8": version "1.8.19" resolved "https://registry.yarnpkg.com/@types/underscore/-/underscore-1.8.19.tgz#ae1357f2d28b8089f86ba0e5545d0512e6ef5b28" integrity sha512-9r6zM91/lTnSYTEJbxf7FwgeVXzRZDegaGPXF+Bp0MSMYTTI2UvQPkoti/YE9ZWThU+0DMya6l9XePvOPBLKow== -"@types/underscore@^1.8.8": - version "1.8.8" - resolved "https://registry.yarnpkg.com/@types/underscore/-/underscore-1.8.8.tgz#510fe1ca5e7fa87fccd405b9a8b566d420bc3d1b" - integrity sha512-EquzRwzAAs04anQ8/6MYXFKvHoD+MIlF+gu87EDda7dN9zrKvQYHsc9VFAPB1xY4tUHQVvBMtjsHrvof2EE1Mg== - "@types/utf8@^2.1.6": version "2.1.6" resolved "https://registry.yarnpkg.com/@types/utf8/-/utf8-2.1.6.tgz#430cabb71a42d0a3613cce5621324fe4f5a25753" @@ -5513,15 +4400,7 @@ dependencies: "@types/ethereum-protocol" "*" -"@types/web3@^1.0.18": - version "1.0.18" - resolved "https://registry.yarnpkg.com/@types/web3/-/web3-1.0.18.tgz#87a8651041d21fc37602ff02327df2c7ecf105d1" - integrity sha512-uXQL0LDszt2f476LEmYM6AvSv9F4vU4hWQvlUhwfLHNlIB6OyBXoYsCzWAIhhnc5U0HA7ZBcPybxRJ/yfA6THg== - dependencies: - "@types/bn.js" "*" - "@types/underscore" "*" - -"@types/web3@^1.0.19": +"@types/web3@^1.0.18", "@types/web3@^1.0.19": version "1.0.19" resolved "https://registry.yarnpkg.com/@types/web3/-/web3-1.0.19.tgz#46b85d91d398ded9ab7c85a5dd57cb33ac558924" integrity sha512-fhZ9DyvDYDwHZUp5/STa9XW2re0E8GxoioYJ4pEUZ13YHpApSagixj7IAdoYH5uAK+UalGq6Ml8LYzmgRA/q+A== @@ -5571,20 +4450,13 @@ resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-11.1.2.tgz#fd4b676846fe731a5de5c6d2e5ef6a377262fc30" integrity sha512-zG61PAp2OcoIBjRV44wftJj6AJgzJrOc32LCYOBqk9bdgcdzK5DCJHV9QZJ60+Fu+fOn79g8Ks3Gixm4CfkZ+w== -"@types/yargs@^13.0.0": +"@types/yargs@^13.0.0", "@types/yargs@^13.0.2": version "13.0.3" resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-13.0.3.tgz#76482af3981d4412d65371a318f992d33464a380" integrity sha512-K8/LfZq2duW33XW/tFwEAfnZlqIfVsoyRB3kfXdPXYhl0nfM8mmh7GS0jg7WrX2Dgq/0Ha/pR1PaR+BvmWwjiQ== dependencies: "@types/yargs-parser" "*" -"@types/yargs@^13.0.2": - version "13.0.2" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-13.0.2.tgz#a64674fc0149574ecd90ba746e932b5a5f7b3653" - integrity sha512-lwwgizwk/bIIU+3ELORkyuOgDjCh7zuWDFqRtPPhhVgq9N1F7CvLNKg1TX4f2duwtKQ0p044Au9r1PLIXHrIzQ== - dependencies: - "@types/yargs-parser" "*" - "@types/zen-observable@^0.8.0": version "0.8.0" resolved "https://registry.yarnpkg.com/@types/zen-observable/-/zen-observable-0.8.0.tgz#8b63ab7f1aa5321248aad5ac890a485656dcea4d" @@ -6137,23 +5009,7 @@ Base64@^1.0.1: resolved "https://registry.yarnpkg.com/Base64/-/Base64-1.0.1.tgz#def45cc50c961bcc9bf2321d0f52bcbfec1f1bb1" integrity sha1-3vRcxQyWG8yb8jIdD1K8v+wfG7E= -JSONStream@^1.0.4: - version "1.3.2" - resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.2.tgz#c102371b6ec3a7cf3b847ca00c20bb0fce4c6dea" - integrity sha1-wQI3G27Dp887hHygDCC7D85Mbeo= - dependencies: - jsonparse "^1.2.0" - through ">=2.2.7 <3" - -JSONStream@^1.2.1: - version "1.3.3" - resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.3.tgz#27b4b8fbbfeab4e71bcf551e7f27be8d952239bf" - integrity sha512-3Sp6WZZ/lXl+nTDoGpGWHEpTnnC6X5fnkolYZR6nwIfzbxxvA8utPWe1gCt7i0m9uVGsSz2IS8K8mJ7HmlduMg== - dependencies: - jsonparse "^1.2.0" - through ">=2.2.7 <3" - -JSONStream@^1.3.4, JSONStream@~1.3.1: +JSONStream@^1.0.4, JSONStream@^1.2.1, JSONStream@^1.3.4, JSONStream@~1.3.1: version "1.3.5" resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== @@ -6243,15 +5099,7 @@ abstract-leveldown@~2.6.0: dependencies: xtend "~4.0.0" -accepts@^1.3.5, accepts@~1.3.3, accepts@~1.3.4, accepts@~1.3.5: - version "1.3.5" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2" - integrity sha1-63d99gEXI6OxTopywIBcjoZ0a9I= - dependencies: - mime-types "~2.1.18" - negotiator "0.6.1" - -accepts@~1.3.7: +accepts@^1.3.5, accepts@~1.3.3, accepts@~1.3.5, accepts@~1.3.7: version "1.3.7" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== @@ -6295,7 +5143,7 @@ acorn-jsx@^5.0.0: resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.0.1.tgz#32a064fd925429216a09b141102bfdd185fae40e" integrity sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg== -"acorn@>= 2.5.2 <= 5.7.3", acorn@^5.6.2: +"acorn@>= 2.5.2 <= 5.7.3", acorn@^5.0.0, acorn@^5.3.0, acorn@^5.6.2: version "5.7.3" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== @@ -6305,17 +5153,7 @@ acorn@^4.0.3: resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" integrity sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c= -acorn@^5.0.0, acorn@^5.3.0: - version "5.5.3" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.5.3.tgz#f473dd47e0277a08e28e9bec5aeeb04751f0b8c9" - integrity sha512-jd5MkIUlbbmb07nXH0DT3y7rDVtkzDi4XZOUVWAer8ajmF/DTSSbl5oNFyDOl/OXA33Bl79+ypHhl2pN20VeOQ== - -acorn@^6.0.5, acorn@^6.0.7: - version "6.1.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.1.1.tgz#7d25ae05bb8ad1f9b699108e1094ecd7884adc1f" - integrity sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA== - -acorn@^6.2.1: +acorn@^6.0.5, acorn@^6.0.7, acorn@^6.2.1: version "6.3.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.3.0.tgz#0087509119ffa4fc0a0041d1e93a417e68cb856e" integrity sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA== @@ -6326,24 +5164,24 @@ aes-js@3.0.0: integrity sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0= aes-js@^3.1.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.1.2.tgz#db9aabde85d5caabbfc0d4f2a4446960f627146a" - integrity sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ== - -agent-base@4, agent-base@^4.1.0, agent-base@^4.2.0, agent-base@~4.2.0, agent-base@~4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.1.tgz#d89e5999f797875674c07d87f260fc41e83e8ca9" - integrity sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg== - dependencies: - es6-promisify "^5.0.0" + version "3.1.2" + resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.1.2.tgz#db9aabde85d5caabbfc0d4f2a4446960f627146a" + integrity sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ== -agent-base@^4.3.0: +agent-base@4, agent-base@^4.1.0, agent-base@^4.2.0, agent-base@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.3.0.tgz#8165f01c436009bccad0b1d122f05ed770efc6ee" integrity sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg== dependencies: es6-promisify "^5.0.0" +agent-base@~4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.1.tgz#d89e5999f797875674c07d87f260fc41e83e8ca9" + integrity sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg== + dependencies: + es6-promisify "^5.0.0" + agentkeepalive@^3.3.0, agentkeepalive@^3.4.1: version "3.5.2" resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-3.5.2.tgz#a113924dd3fa24a0bc3b78108c450c2abee00f67" @@ -6386,17 +5224,7 @@ ajv-keywords@^1.1.1: resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c" integrity sha1-MU3QpLM2j609/NxU7eYXG4htrzw= -ajv-keywords@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.1.0.tgz#ac2b27939c543e95d2c06e7f7f5c27be4aa543be" - integrity sha1-rCsnk5xUPpXSwG5/f1wnvkqlQ74= - -ajv-keywords@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.2.0.tgz#e86b819c602cf8821ad637413698f1dec021847a" - integrity sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo= - -ajv-keywords@^3.4.1: +ajv-keywords@^3.1.0, ajv-keywords@^3.2.0, ajv-keywords@^3.4.1: version "3.4.1" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.1.tgz#ef916e271c64ac12171fd8384eaae6b2345854da" integrity sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ== @@ -6409,7 +5237,7 @@ ajv@^4.7.0, ajv@^4.9.1: co "^4.6.0" json-stable-stringify "^1.0.1" -ajv@^5.1.0, ajv@^5.1.1, ajv@^5.3.0: +ajv@^5.1.1, ajv@^5.3.0: version "5.5.2" resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" integrity sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU= @@ -6419,17 +5247,7 @@ ajv@^5.1.0, ajv@^5.1.1, ajv@^5.3.0: fast-json-stable-stringify "^2.0.0" json-schema-traverse "^0.3.0" -ajv@^6.1.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.4.0.tgz#d3aff78e9277549771daf0164cff48482b754fc6" - integrity sha1-06/3jpJ3VJdx2vAWTP9ISCt1T8Y= - dependencies: - fast-deep-equal "^1.0.0" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.3.0" - uri-js "^3.0.2" - -ajv@^6.10.2: +ajv@^6.1.0, ajv@^6.10.2, ajv@^6.5.3, ajv@^6.6.1, ajv@^6.9.1: version "6.10.2" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52" integrity sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw== @@ -6439,26 +5257,6 @@ ajv@^6.10.2: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^6.5.3: - version "6.7.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.7.0.tgz#e3ce7bb372d6577bb1839f1dfdfcbf5ad2948d96" - integrity sha512-RZXPviBTtfmtka9n9sy1N5M5b82CbxWIR6HIis4s3WQTXDJamc/0gpCWNGz6EWdWp4DOfjzJfhz/AS9zVPjjWg== - dependencies: - fast-deep-equal "^2.0.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ajv@^6.6.1, ajv@^6.9.1: - version "6.10.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.0.tgz#90d0d54439da587cd7e843bfb7045f50bd22bdf1" - integrity sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg== - dependencies: - fast-deep-equal "^2.0.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - algebrite@^0.2.23: version "0.2.23" resolved "https://registry.yarnpkg.com/algebrite/-/algebrite-0.2.23.tgz#e0490d7c6ea7ddb0dc46fc98d1026415dfe2d853" @@ -6506,16 +5304,11 @@ ansi-cyan@^0.1.1: dependencies: ansi-wrap "0.1.0" -ansi-escapes@3.2.0, ansi-escapes@^3.1.0, ansi-escapes@^3.2.0: +ansi-escapes@3.2.0, ansi-escapes@^3.0.0, ansi-escapes@^3.1.0, ansi-escapes@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== -ansi-escapes@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.1.0.tgz#f73207bb81207d75fd6c83f125af26eea378ca30" - integrity sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw== - ansi-fragments@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/ansi-fragments/-/ansi-fragments-0.2.1.tgz#24409c56c4cc37817c3d7caa99d8969e2de5a05e" @@ -6554,12 +5347,7 @@ ansi-regex@^3.0.0, ansi-regex@~3.0.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= -ansi-regex@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.0.0.tgz#70de791edf021404c3fd615aa89118ae0432e5a9" - integrity sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w== - -ansi-regex@^4.1.0: +ansi-regex@^4.0.0, ansi-regex@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== @@ -6691,14 +5479,6 @@ apollo-cache-persist@^0.1.1: resolved "https://registry.yarnpkg.com/apollo-cache-persist/-/apollo-cache-persist-0.1.1.tgz#e6cfe1983b998982a679aaf05241d3ed395edb1e" integrity sha512-/7GAyblPR169ryW3ugbtHqiU0UGkhIt10NeaO2gn2ClxjLHF/nIkJD5mx/0OCF2vLNbbnzLZVDeIO1pf72TrEA== -apollo-cache@1.1.26: - version "1.1.26" - resolved "https://registry.yarnpkg.com/apollo-cache/-/apollo-cache-1.1.26.tgz#5afe023270effbc2063d90f51d8e56bce274ab37" - integrity sha512-JKFHijwkhXpcQ3jOat+ctwiXyjDhQgy0p6GSaj7zG+or+ZSalPqUnPzFRgRwFLVbYxBKJgHCkWX+2VkxWTZzQQ== - dependencies: - apollo-utilities "^1.1.3" - tslib "^1.9.3" - apollo-cache@1.2.1, apollo-cache@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/apollo-cache/-/apollo-cache-1.2.1.tgz#aae71eb4a11f1f7322adc343f84b1a39b0693644" @@ -6707,21 +5487,7 @@ apollo-cache@1.2.1, apollo-cache@^1.2.1: apollo-utilities "^1.2.1" tslib "^1.9.3" -apollo-client@^2.4.13: - version "2.4.13" - resolved "https://registry.yarnpkg.com/apollo-client/-/apollo-client-2.4.13.tgz#09829fcbd68e069de9840d0a10764d7c6a3d0787" - integrity sha512-7mBdW/CW1qHB8Mj4EFAG3MTtbRc6S8aUUntUdrKfRWV1rZdWa0NovxsgVD/R4HZWZjRQ2UOM4ENsHdM5g1uXOQ== - dependencies: - "@types/zen-observable" "^0.8.0" - apollo-cache "1.1.26" - apollo-link "^1.0.0" - apollo-link-dedup "^1.0.0" - apollo-utilities "1.1.3" - symbol-observable "^1.0.2" - tslib "^1.9.3" - zen-observable "^0.8.0" - -apollo-client@^2.5.1: +apollo-client@^2.4.13, apollo-client@^2.5.1: version "2.5.1" resolved "https://registry.yarnpkg.com/apollo-client/-/apollo-client-2.5.1.tgz#36126ed1d32edd79c3713c6684546a3bea80e6d1" integrity sha512-MNcQKiqLHdGmNJ0rZ0NXaHrToXapJgS/5kPk0FygXt+/FmDCdzqcujI7OPxEC6e9Yw5S/8dIvOXcRNuOMElHkA== @@ -6903,15 +5669,7 @@ apollo-tracing@0.5.1: apollo-server-env "2.2.0" graphql-extensions "0.5.2" -apollo-utilities@1.1.3, apollo-utilities@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/apollo-utilities/-/apollo-utilities-1.1.3.tgz#a8883c0392f6b46eac0d366204ebf34be9307c87" - integrity sha512-pF9abhiClX5gfj/WFWZh8DiI33nOLGxRhXH9ZMquaM1V8bhq1WLFPt2QjShWH3kGQVeIGUK+FQefnhe+ZaaAYg== - dependencies: - fast-json-stable-stringify "^2.0.0" - tslib "^1.9.3" - -apollo-utilities@1.2.1, apollo-utilities@^1.2.1: +apollo-utilities@1.2.1, apollo-utilities@^1.0.0, apollo-utilities@^1.0.1, apollo-utilities@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/apollo-utilities/-/apollo-utilities-1.2.1.tgz#1c3a1ebf5607d7c8efe7636daaf58e7463b41b3c" integrity sha512-Zv8Udp9XTSFiN8oyXOjf6PMHepD4yxxReLsl6dPUy5Ths7jti3nmlBzZUOxuTWRwZn0MoclqL7RQ5UEJN8MAxg== @@ -6920,14 +5678,6 @@ apollo-utilities@1.2.1, apollo-utilities@^1.2.1: ts-invariant "^0.2.1" tslib "^1.9.3" -apollo-utilities@^1.0.0, apollo-utilities@^1.0.1: - version "1.0.21" - resolved "https://registry.yarnpkg.com/apollo-utilities/-/apollo-utilities-1.0.21.tgz#cb8b5779fe275850b16046ff8373f4af2de90765" - integrity sha512-ZcxELlEl+sDCYBgEMdNXJAsZtRVm8wk4HIA58bMsqYfd1DSAJQEtZ93F0GZgYNAGy3QyaoBeZtbb0/01++G8JQ== - dependencies: - fast-json-stable-stringify "^2.0.0" - fclone "^1.0.11" - app-module-path@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/app-module-path/-/app-module-path-2.2.0.tgz#641aa55dfb7d6a6f0a8141c4b9c0aa50b6c24dd5" @@ -7386,12 +6136,7 @@ async-done@^1.2.0, async-done@^1.2.2: process-nextick-args "^2.0.0" stream-exhaust "^1.0.1" -async-each@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" - integrity sha1-GdOGodntxufByF04iu28xW0zYC0= - -async-each@^1.0.1: +async-each@^1.0.0, async-each@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.2.tgz#8b8a7ca2a658f927e9f307d6d1a42f4199f0f735" integrity sha512-6xrbvN0MOBKSJDdonmSSz2OwFSgxRaVtBDes26mj9KIGtDo+g9xosFRSC+i1gQh2oAN/tQ62AI/pGZGQjVOiRg== @@ -7466,21 +6211,14 @@ async@2.6.1: dependencies: lodash "^4.17.10" -async@2.6.2, async@^2.5.0, async@^2.6.1: +async@2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/async/-/async-2.6.2.tgz#18330ea7e6e313887f5d2f2a904bac6fe4dd5381" integrity sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg== dependencies: lodash "^4.17.11" -async@^2.0.1, async@^2.1.2, async@^2.1.5, async@^2.3.0, async@^2.4.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.0.tgz#61a29abb6fcc026fea77e56d1c6ec53a795951f4" - integrity sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw== - dependencies: - lodash "^4.14.0" - -async@^2.6.3: +async@^2.0.1, async@^2.1.2, async@^2.1.5, async@^2.3.0, async@^2.4.0, async@^2.5.0, async@^2.6.1, async@^2.6.3: version "2.6.3" resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== @@ -7648,19 +6386,6 @@ aws4@^1.2.1, aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== -aws4@^1.6.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.7.0.tgz#d4d0e9b9dbfca77bf08eeb0a8a471550fe39e289" - integrity sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w== - -axios@^0.18.0: - version "0.18.0" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.18.0.tgz#32d53e4851efdc0a11993b6cd000789d70c05102" - integrity sha1-MtU+SFHv3AoRmTts0AB4nXDAUQI= - dependencies: - follow-redirects "^1.3.0" - is-buffer "^1.1.5" - 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" @@ -7675,7 +6400,7 @@ babel-core@7.0.0-bridge.0: resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-7.0.0-bridge.0.tgz#95a492ddd90f9b4e9a4a1da14eb335b87b634ece" integrity sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg== -babel-core@^6.0.14, babel-core@^6.17.0, babel-core@^6.26.0: +babel-core@^6.0.14, babel-core@^6.17.0, babel-core@^6.23.1, babel-core@^6.26.0: version "6.26.3" resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" integrity sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA== @@ -7700,31 +6425,6 @@ babel-core@^6.0.14, babel-core@^6.17.0, babel-core@^6.26.0: slash "^1.0.0" source-map "^0.5.7" -babel-core@^6.23.1: - version "6.26.2" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.2.tgz#b67a120521dcd6baf1a2ecceeceb595e223da06c" - integrity sha512-rFKFnHY8sbRSqja2O5eTx0z0Na5hukdtsFt7X9xdBFXMurrJ5YoY78Y/2/EuNZIaDQKEJSfxSMePfsymxt0CZg== - dependencies: - babel-code-frame "^6.26.0" - babel-generator "^6.26.0" - babel-helpers "^6.24.1" - babel-messages "^6.23.0" - babel-register "^6.26.0" - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - convert-source-map "^1.5.1" - debug "^2.6.9" - json5 "^0.5.1" - lodash "^4.17.4" - minimatch "^3.0.4" - path-is-absolute "^1.0.1" - private "^0.1.8" - slash "^1.0.0" - source-map "^0.5.7" - babel-eslint@10.0.1: version "10.0.1" resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.0.1.tgz#919681dc099614cd7d31d45c8908695092a1faed" @@ -8514,11 +7214,6 @@ base64-js@^1.0.2, base64-js@^1.1.2, base64-js@^1.2.3, base64-js@^1.3.0: resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3" integrity sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw== -base64url@2.0.0, base64url@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/base64url/-/base64url-2.0.0.tgz#eac16e03ea1438eff9423d69baa36262ed1f70bb" - integrity sha1-6sFuA+oUOO/5Qj1puqNiYu0fcLs= - base@^0.11.1: version "0.11.2" resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" @@ -8561,26 +7256,11 @@ before-after-hook@^2.0.0: resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.1.0.tgz#b6c03487f44e24200dd30ca5e6a1979c5d2fb635" integrity sha512-IWIbu7pMqyw3EAJHzzHbWa85b6oud/yfKYg5rqB5hNE8CeMi3nX+2C2sj0HswfblST86hpVEOAb9x34NZd6P7A== -big-integer@^1.6.15: - version "1.6.36" - resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.36.tgz#78631076265d4ae3555c04f85e7d9d2f3a071a36" - integrity sha512-t70bfa7HYEA1D9idDbmuv7YbsbVkQ+Hp+8KFSul4aE5e/i1bjCNIRYJZlA8Q8p0r9T8cF/RVvwUgRA//FydEyg== - -big-integer@^1.6.31: - version "1.6.31" - resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.31.tgz#6d7852486e67c642502dcc03f7225a245c9fc7fa" - integrity sha512-lDbZNHHwxDKnjP7LWg2leO+tjs4SyVs2Z83dsR1Idbe2urRnxZAUdeQ8YBhHaGaWK/4WM3mz+RlbZsgqck17CA== - -big-integer@^1.6.44: +big-integer@^1.6.15, big-integer@^1.6.31, big-integer@^1.6.44, big-integer@^1.6.7: version "1.6.44" resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.44.tgz#4ee9ae5f5839fc11ade338fea216b4513454a539" integrity sha512-7MzElZPTyJ2fNvBkPxtFQ2fWIkVmuzw41+BZHSzpEq3ymB2MfeKp1+yXl/tS75xCx+WnyV+yb0kp+K1C3UNwmQ== -big-integer@^1.6.7: - version "1.6.28" - resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.28.tgz#8cef0fda3ccde8759c2c66efcfacc35aea658283" - integrity sha512-OJT3rzgtsYca/5WmmEuFJDPMwROVh5SSjoEX9wIrpfbbWJ4KqRzShs8Cj6jWHaatBYAeWngBA+kmmrcHSklT1g== - big.js@^3.1.3: version "3.2.0" resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" @@ -8596,16 +7276,16 @@ bigi@^1.1.0: resolved "https://registry.yarnpkg.com/bigi/-/bigi-1.4.2.tgz#9c665a95f88b8b08fc05cfd731f561859d725825" integrity sha1-nGZalfiLiwj8Bc/XMfVhhZ1yWCU= -bignumber.js@*, bignumber.js@7.2.1, bignumber.js@^7.0.0, bignumber.js@^7.2.1: +bignumber.js@*, bignumber.js@~8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-8.0.2.tgz#d8c4e1874359573b1ef03011a2d861214aeef137" + integrity sha512-EiuvFrnbv0jFixEQ9f58jo7X0qI2lNGIr/MxntmVzQc5JUweDSh8y8hbTCAomFtqwUPIOWcLXP0VEOSZTG7FFw== + +bignumber.js@7.2.1, bignumber.js@^7.0.0, bignumber.js@^7.2.0, bignumber.js@^7.2.1: version "7.2.1" resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-7.2.1.tgz#80c048759d826800807c4bfd521e50edbba57a5f" integrity sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ== -bignumber.js@^7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-7.2.0.tgz#2a477d9dd87d3fedf77b18ad8ba9e373ef275850" - integrity sha512-WWHzlaRFrhO84RfylRcoAye2yQwlUMVASbgjYpRUsAULM/8KpQn+DL0e+xVgLqAzaS/qImPled4wDdmpIBnmEg== - "bignumber.js@git+https://github.com/debris/bignumber.js#master": version "2.0.7" resolved "git+https://github.com/debris/bignumber.js#c7a38de919ed75e6fb6ba38051986e294b328df9" @@ -8618,11 +7298,6 @@ bignumber.js@^7.2.0: version "2.0.7" resolved "git+https://github.com/frozeman/bignumber.js-nolookahead.git#57692b3ecfc98bbdd6b3a516cb2353652ea49934" -bignumber.js@~8.0.2: - version "8.0.2" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-8.0.2.tgz#d8c4e1874359573b1ef03011a2d861214aeef137" - integrity sha512-EiuvFrnbv0jFixEQ9f58jo7X0qI2lNGIr/MxntmVzQc5JUweDSh8y8hbTCAomFtqwUPIOWcLXP0VEOSZTG7FFw== - binary-extensions@^1.0.0: version "1.11.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205" @@ -8633,12 +7308,7 @@ binary-extensions@^2.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.0.0.tgz#23c0df14f6a88077f5f986c0d167ec03c3d5537c" integrity sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow== -bindings@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.3.0.tgz#b346f6ecf6a95f5a815c5839fc7cdb22502f1ed7" - integrity sha512-DpLh5EzMR2kzvX1KIlVC0VkC3iZtHKTgdtZ0a3pglBZdaQFjt5S9g9xd1lE+YvXyfd6mtCeRnrUfOLYiTMlNSw== - -bindings@^1.3.0, bindings@^1.4.0, bindings@^1.5.0: +bindings@^1.2.1, bindings@^1.3.0, bindings@^1.4.0, bindings@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== @@ -8662,7 +7332,7 @@ bip32@^1.0.2: typeforce "^1.11.5" wif "^2.0.6" -bip39@2.5.0, bip39@^2.5.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== @@ -8673,7 +7343,7 @@ bip39@2.5.0, bip39@^2.5.0: safe-buffer "^5.0.1" unorm "^1.3.3" -bip39@^2.2.0: +bip39@^2.2.0, bip39@^2.5.0: version "2.6.0" resolved "https://registry.yarnpkg.com/bip39/-/bip39-2.6.0.tgz#9e3a720b42ec8b3fbe4038f1e445317b6a99321c" integrity sha512-RrnQRG2EgEoqO24ea+Q/fftuPUZLmrEM3qNhhGsA3PbaXaCW791LTzPuVyx/VprXQcTbPJ3K3UeTna8ZnVl2sg== @@ -8764,7 +7434,7 @@ block-stream@0.0.9: ts-node "^8.4.1" typescript "^3.6.4" -bluebird@3.5.x, bluebird@^3.5.5, bluebird@~3.5.0: +bluebird@3.5.x, bluebird@^3.0.0, bluebird@^3.5.0, bluebird@^3.5.1, bluebird@^3.5.3, bluebird@^3.5.5, bluebird@~3.5.0: version "3.5.5" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.5.tgz#a8d0afd73251effbbd5fe384a77d73003c17a71f" integrity sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w== @@ -8774,21 +7444,6 @@ bluebird@^2.9.33, bluebird@^2.9.34: resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-2.11.0.tgz#534b9033c022c9579c56ba3b3e5a5caafbb650e1" integrity sha1-U0uQM8AiyVecVro7Plpcqvu2UOE= -bluebird@^3.0.0: - version "3.5.2" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.2.tgz#1be0908e054a751754549c270489c1505d4ab15a" - integrity sha512-dhHTWMI7kMx5whMQntl7Vr9C6BvV10lFXDAasnqnrMYhXVCzzk6IO9Fo2L75jXHT07WrOngL1WDXOp+yYS91Yg== - -bluebird@^3.5.0, bluebird@^3.5.1: - version "3.5.1" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" - integrity sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA== - -bluebird@^3.5.3: - version "3.5.3" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.3.tgz#7d01c6f9616c9a51ab0f8c549a79dfe6ec33efa7" - integrity sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw== - blueimp-md5@^2.10.0: version "2.11.0" resolved "https://registry.yarnpkg.com/blueimp-md5/-/blueimp-md5-2.11.0.tgz#eff55d30fe3daddd7e801072e2c4483e5fcfc87c" @@ -8809,23 +7464,7 @@ bn.js@^2.0.3: resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-2.2.0.tgz#12162bc2ae71fc40a5626c33438f3a875cd37625" integrity sha1-EhYrwq5x/EClYmwzQ486h1zTdiU= -body-parser@1.18.2, body-parser@^1.16.0: - version "1.18.2" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.2.tgz#87678a19d84b47d859b83199bd59bce222b10454" - integrity sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ= - dependencies: - bytes "3.0.0" - content-type "~1.0.4" - debug "2.6.9" - depd "~1.1.1" - http-errors "~1.6.2" - iconv-lite "0.4.19" - on-finished "~2.3.0" - qs "6.5.1" - raw-body "2.3.2" - type-is "~1.6.15" - -body-parser@1.18.3, body-parser@^1.18.3: +body-parser@1.18.3: version "1.18.3" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.3.tgz#5b292198ffdd553b3a0f20ded0592b956955c8b4" integrity sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ= @@ -8841,7 +7480,7 @@ body-parser@1.18.3, body-parser@^1.18.3: raw-body "2.3.3" type-is "~1.6.16" -body-parser@1.19.0, body-parser@^1.19.0: +body-parser@1.19.0, body-parser@^1.16.0, body-parser@^1.18.3, body-parser@^1.19.0: version "1.19.0" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== @@ -8869,20 +7508,6 @@ boom@2.x.x: dependencies: hoek "2.x.x" -boom@4.x.x: - version "4.3.1" - resolved "https://registry.yarnpkg.com/boom/-/boom-4.3.1.tgz#4f8a3005cb4a7e3889f749030fd25b96e01d2e31" - integrity sha1-T4owBctKfjiJ90kDD9JbluAdLjE= - dependencies: - hoek "4.x.x" - -boom@5.x.x: - 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" - boxen@^1.0.0, boxen@^1.2.1: version "1.3.0" resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b" @@ -9015,13 +7640,6 @@ browserify-rsa@^4.0.0: bn.js "^4.1.0" randombytes "^2.0.1" -browserify-sha3@^0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/browserify-sha3/-/browserify-sha3-0.0.1.tgz#3ff34a3006ef15c0fb3567e541b91a2340123d11" - integrity sha1-P/NKMAbvFcD7NWflQbkaI0ASPRE= - dependencies: - js-sha3 "^0.3.1" - browserify-sha3@^0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/browserify-sha3/-/browserify-sha3-0.0.4.tgz#086c47b8c82316c9d47022c26185954576dd8e26" @@ -9058,16 +7676,7 @@ browserslist@^3.2.6: caniuse-lite "^1.0.30000844" electron-to-chromium "^1.3.47" -browserslist@^4.1.0: - version "4.3.7" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.3.7.tgz#f1de479a6466ea47a0a26dcc725e7504817e624a" - integrity sha512-pWQv51Ynb0MNk9JGMCZ8VkM785/4MQNXiFYtPqI7EEP0TJO+/d/NqRVn1uiAN0DNbnlUSpL2sh16Kspasv3pUQ== - dependencies: - caniuse-lite "^1.0.30000925" - electron-to-chromium "^1.3.96" - node-releases "^1.1.3" - -browserslist@^4.6.0, browserslist@^4.6.2: +browserslist@^4.1.0, browserslist@^4.6.0, browserslist@^4.6.2: version "4.6.6" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.6.6.tgz#6e4bf467cde520bc9dbdf3747dafa03531cec453" integrity sha512-D2Nk3W9JL9Fp/gIcWei8LrERCS+eXu9AM5cfXA8WEZ84lFks+ARnZ0q/R69m2SV3Wjma83QDDPxsNKXUwdIsyA== @@ -9126,25 +7735,12 @@ buf-compare@^1.0.0: resolved "https://registry.yarnpkg.com/buf-compare/-/buf-compare-1.0.1.tgz#fef28da8b8113a0a0db4430b0b6467b69730b34a" integrity sha1-/vKNqLgROgoNtEMLC2Rntpcws0o= -buffer-alloc-unsafe@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-0.1.1.tgz#ffe1f67551dd055737de253337bfe853dfab1a6a" - integrity sha1-/+H2dVHdBVc33iUzN7/oU9+rGmo= - buffer-alloc-unsafe@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg== -buffer-alloc@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.1.0.tgz#05514d33bf1656d3540c684f65b1202e90eca303" - integrity sha1-BVFNM78WVtNUDGhPZbEgLpDsowM= - dependencies: - buffer-alloc-unsafe "^0.1.0" - buffer-fill "^0.1.0" - -buffer-alloc@^1.2.0: +buffer-alloc@^1.1.0, buffer-alloc@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow== @@ -9172,26 +7768,16 @@ buffer-equal@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-1.0.0.tgz#59616b498304d556abd466966b22eeda3eca5fbe" integrity sha1-WWFrSYME1Var1GaWayLu2j7KX74= -buffer-fill@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-0.1.1.tgz#76d825c4d6e50e06b7a31eb520c04d08cc235071" - integrity sha512-YgBMBzdRLEfgxJIGu2wrvI2E03tMCFU1p7d1KhB4BOoMN0VxmTFjSyN5JtKt9z8Z9JajMHruI6SE25W96wNv7Q== - buffer-fill@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" integrity sha1-+PeLdniYiO858gXNY39o5wISKyw= -buffer-from@1.x: +buffer-from@1.x, buffer-from@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== -buffer-from@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.0.0.tgz#4cb8832d23612589b0406e9e2956c17f06fdf531" - integrity sha512-83apNb8KK0Se60UE1+4Ukbe3HbfELJ6UlI4ldtOGs7So4KD26orJM8hIY9lxdzP+UpItH1Yh/Y8GUvNFWFFRxA== - buffer-reverse@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/buffer-reverse/-/buffer-reverse-1.0.1.tgz#49283c8efa6f901bc01fa3304d06027971ae2f60" @@ -9235,23 +7821,7 @@ buffer@^4.3.0, buffer@^4.9.0, buffer@^4.9.1: ieee754 "^1.1.4" isarray "^1.0.0" -buffer@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.2.0.tgz#53cf98241100099e9eeae20ee6d51d21b16e541e" - integrity sha512-nUJyfChH7PMJy75eRDCCKtszSEFokUNXC1hNVSe+o+VdcgvDPLs20k3v8UXI8ruRYAJiYtyRea8mYyqPxoHWDw== - dependencies: - base64-js "^1.0.2" - ieee754 "^1.1.4" - -buffer@^5.0.5, buffer@^5.0.6: - version "5.1.0" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.1.0.tgz#c913e43678c7cb7c8bd16afbcddb6c5505e8f9fe" - integrity sha512-YkIRgwsZwJWTnyQrsBTWefizHh+8GYj3kbL1BTiAQ/9pwpino0G7B2gp5tx/FUBqUlvtxV85KNR3mwfAtv15Yw== - dependencies: - base64-js "^1.0.2" - ieee754 "^1.1.4" - -buffer@^5.2.1: +buffer@^5.0.0, buffer@^5.0.5, buffer@^5.0.6, buffer@^5.2.1: version "5.2.1" resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.2.1.tgz#dd57fa0f109ac59c602479044dca7b8b3d0b71d6" integrity sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg== @@ -9392,27 +7962,7 @@ cacache@^11.0.2: unique-filename "^1.1.1" y18n "^4.0.0" -cacache@^12.0.0: - version "12.0.0" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.0.tgz#1ed91cc306312a53ad688b1563ce4c416faec564" - integrity sha512-0baf1FhCp16LhN+xDJsOrSiaPDCTD3JegZptVmLDoEbFcT5aT+BeFGt3wcDU3olCP5tpTCXU5sv0+TsKWT9WGQ== - dependencies: - bluebird "^3.5.5" - chownr "^1.1.1" - figgy-pudding "^3.5.1" - glob "^7.1.4" - graceful-fs "^4.1.15" - lru-cache "^5.1.1" - mississippi "^3.0.0" - mkdirp "^0.5.1" - move-concurrently "^1.0.1" - promise-inflight "^1.0.1" - rimraf "^2.6.3" - ssri "^6.0.1" - unique-filename "^1.1.1" - y18n "^4.0.0" - -cacache@^12.0.2: +cacache@^12.0.0, cacache@^12.0.2: version "12.0.3" resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.3.tgz#be99abba4e1bf5df461cd5a2c1071fc432573390" integrity sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw== @@ -9608,7 +8158,7 @@ camelcase-keys@^4.0.0: map-obj "^2.0.0" quick-lru "^1.0.0" -camelcase@5.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== @@ -9633,7 +8183,7 @@ 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.3.1: +camelcase@^5.0.0, camelcase@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== @@ -9650,17 +8200,7 @@ can-promise@0.0.1: dependencies: window-or-global "^1.0.1" -caniuse-lite@^1.0.30000844: - version "1.0.30000981" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000981.tgz#5b6828803362363e5a1deba2eb550185cf6cec8f" - integrity sha512-JTByHj4DQgL2crHNMK6PibqAMrqqb/Vvh0JrsTJVSWG4VSUrT16EklkuRZofurlMjgA9e+zlCM4Y39F3kootMQ== - -caniuse-lite@^1.0.30000925: - version "1.0.30000927" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000927.tgz#114a9de4ff1e01f5790fe578ecd93421c7524665" - integrity sha512-ogq4NbUWf1uG/j66k0AmiO3GjqJAlQyF8n4w8a954cbCyFKmYGvRtgz6qkq2fWuduTXHibX7GyYL5Pg58Aks2g== - -caniuse-lite@^1.0.30000984: +caniuse-lite@^1.0.30000844, caniuse-lite@^1.0.30000984: version "1.0.30000989" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000989.tgz#b9193e293ccf7e4426c5245134b8f2a56c0ac4b9" integrity sha512-vrMcvSuMz16YY6GSVZ0dWDTJP8jqk3iFQ/Aq5iqblPwxSVVZI+zxDyTX0VPqtQsDnfdrBDcsmhgTEOh5R8Lbpw== @@ -9744,7 +8284,7 @@ chai@^4.0.1, chai@^4.1.2, chai@^4.2.0: pathval "^1.1.0" type-detect "^4.0.5" -chalk@2.4.2, chalk@^2.4.2: +chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.3.1, chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -9773,15 +8313,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.1.0, 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" - change-case@3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/change-case/-/change-case-3.1.0.tgz#0e611b7edc9952df2e8513b27b42de72647dd17e" @@ -9886,7 +8417,7 @@ chmodr@~1.0.2: resolved "https://registry.yarnpkg.com/chmodr/-/chmodr-1.0.2.tgz#04662b932d0f02ec66deaa2b0ea42811968e3eb9" integrity sha1-BGYrky0PAuxm3qorDqQoEZaOPrk= -chokidar@2.0.4, chokidar@^2.0.4: +chokidar@2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.4.tgz#356ff4e2b0e8e43e322d18a372460bbcf3accd26" integrity sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ== @@ -9922,7 +8453,7 @@ chokidar@^1.4.2: optionalDependencies: fsevents "^1.0.0" -chokidar@^2.0.0, chokidar@^2.1.5: +chokidar@^2.0.0, chokidar@^2.0.2, chokidar@^2.1.5: version "2.1.8" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== @@ -9941,25 +8472,6 @@ chokidar@^2.0.0, chokidar@^2.1.5: optionalDependencies: fsevents "^1.2.7" -chokidar@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.3.tgz#dcbd4f6cbb2a55b4799ba8a840ac527e5f4b1176" - integrity sha512-zW8iXYZtXMx4kux/nuZVXjkLP+CyIK5Al5FHnj1OgTKGZfp4Oy6/ymtMSKFv3GD8DviEmUPmJg9eFdJ/JzudMg== - dependencies: - anymatch "^2.0.0" - async-each "^1.0.0" - braces "^2.3.0" - glob-parent "^3.1.0" - inherits "^2.0.1" - is-binary-path "^1.0.0" - is-glob "^4.0.0" - normalize-path "^2.1.1" - path-is-absolute "^1.0.0" - readdirp "^2.0.0" - upath "^1.0.0" - optionalDependencies: - fsevents "^1.1.2" - chokidar@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.0.2.tgz#0d1cd6d04eb2df0327446188cd13736a3367d681" @@ -9975,24 +8487,17 @@ chokidar@^3.0.2: optionalDependencies: fsevents "^2.0.6" -chownr@^1.0.1, chownr@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181" - integrity sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE= - -chownr@^1.1.1: +chownr@^1.0.1, chownr@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" integrity sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g== -chrome-trace-event@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz#45a91bd2c20c9411f0963b5aaeb9a1b95e09cc48" - integrity sha512-xDbVgyfDTT2piup/h8dK/y4QZfJRSa73bw1WZ8b4XM1o7fsFubUVGYcE+1ANtOzJJELGpYoG2961z0Z6OAld9A== - dependencies: - tslib "^1.9.0" +chownr@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181" + integrity sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE= -chrome-trace-event@^1.0.2: +chrome-trace-event@^1.0.0, chrome-trace-event@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4" integrity sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ== @@ -10116,37 +8621,7 @@ cli-truncate@^1.0.0: slice-ansi "^1.0.0" string-width "^2.0.0" -cli-ux@^5.2.1: - version "5.3.0" - resolved "https://registry.yarnpkg.com/cli-ux/-/cli-ux-5.3.0.tgz#6f6183e03a2b765fb1d973af484d5a47775d2a9c" - integrity sha512-4iNRnT85aX6DP7TmwoM2zycHQt8S2i0R/7tAqnfNWVDOM04b2E9hxbYsidCx1p8+xTM6wLZSOVHP+lvclHAXpQ== - dependencies: - "@oclif/command" "^1.5.1" - "@oclif/errors" "^1.2.1" - "@oclif/linewrap" "^1.0.0" - "@oclif/screen" "^1.0.3" - ansi-escapes "^3.1.0" - ansi-styles "^3.2.1" - cardinal "^2.1.1" - chalk "^2.4.1" - clean-stack "^2.0.0" - extract-stack "^1.0.0" - fs-extra "^7.0.1" - hyperlinker "^1.0.0" - indent-string "^3.2.0" - is-wsl "^1.1.0" - lodash "^4.17.11" - natural-orderby "^2.0.1" - password-prompt "^1.1.2" - semver "^5.6.0" - string-width "^3.1.0" - strip-ansi "^5.1.0" - supports-color "^5.5.0" - supports-hyperlinks "^1.0.1" - treeify "^1.1.0" - tslib "^1.9.3" - -cli-ux@^5.3.1: +cli-ux@^5.2.1, cli-ux@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/cli-ux/-/cli-ux-5.3.1.tgz#3bed8b37c44b03a5d1b9d71d39a69a919a101835" integrity sha512-l2MXbitx0FjtHKSbHytuxfxWv6MdWBRh23ItRJjU17cjj0dqZxfAL863tzbR1FIs7jccPllPUvn3QWK6BQg3Pg== @@ -10353,26 +8828,19 @@ 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== dependencies: color-name "1.1.3" -color-convert@^1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.1.tgz#c1261107aeb2f294ebffec9ed9ecad529a6097ed" - integrity sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ== - dependencies: - color-name "^1.1.1" - -color-name@1.1.3, color-name@^1.0.0: +color-name@1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= -color-name@^1.1.1: +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== @@ -10428,21 +8896,11 @@ colors@1.2.4: resolved "https://registry.yarnpkg.com/colors/-/colors-1.2.4.tgz#e0cb41d3e4b20806b3bfc27f4559f01b94bc2f7c" integrity sha512-6Y+iBnWmXL+AWtlOp2Vr6R2w5MUlNJRwR0ShVFaAb1CqWzhPOpQg4L0jxD+xpw/Nc8QJwaq3KM79QUCriY8CWQ== -colors@^1.0.3: +colors@^1.0.3, colors@^1.1.2, colors@^1.2.1: version "1.3.3" resolved "https://registry.yarnpkg.com/colors/-/colors-1.3.3.tgz#39e005d546afe01e01f9c4ca8fa50f686a01205d" integrity sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg== -colors@^1.1.2: - version "1.2.1" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.2.1.tgz#f4a3d302976aaf042356ba1ade3b1a2c62d9d794" - integrity sha512-s8+wktIuDSLffCywiwSxQOMqtPxML11a/dtHE17tMn4B1MSWw/C22EKf7M2KGUBcDaVFEGT+S8N02geDXeuNKg== - -colors@^1.2.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.3.2.tgz#2df8ff573dfbf255af562f8ce7181d6b971a359b" - integrity sha512-rhP0JSBGYvpcNQj4s5AdShMeE5ahMop96cTeDl/v9qQQm2fYClE2QXZRi8wLzc+GmXSxdIqqbOIAhyObEXDbfQ== - colorspace@1.1.x: version "1.1.1" resolved "https://registry.yarnpkg.com/colorspace/-/colorspace-1.1.1.tgz#9ac2491e1bc6f8fb690e2176814f8d091636d972" @@ -10464,27 +8922,13 @@ columnify@^1.5.4, columnify@~1.5.4: strip-ansi "^3.0.0" wcwidth "^1.0.0" -combined-stream@1.0.6, combined-stream@~1.0.5, combined-stream@~1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818" - integrity sha1-cj599ugBrFYTETp+RFqbactjKBg= - dependencies: - delayed-stream "~1.0.0" - -combined-stream@^1.0.5: +combined-stream@^1.0.5, combined-stream@^1.0.6, combined-stream@~1.0.5, combined-stream@~1.0.6: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== dependencies: delayed-stream "~1.0.0" -combined-stream@^1.0.6: - version "1.0.7" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.7.tgz#2d1d24317afb8abe95d6d2c0b07b57813539d828" - integrity sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w== - dependencies: - delayed-stream "~1.0.0" - command-exists@^1.2.8: version "1.2.8" resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.8.tgz#715acefdd1223b9c9b37110a149c6392c2852291" @@ -10504,7 +8948,7 @@ commander@2.11.0: resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" integrity sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ== -commander@2.15.1, commander@^2.12.1, commander@^2.8.1, commander@^2.9.0: +commander@2.15.1: version "2.15.1" resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f" integrity sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag== @@ -10514,7 +8958,7 @@ commander@2.18.0: resolved "https://registry.yarnpkg.com/commander/-/commander-2.18.0.tgz#2bf063ddee7c7891176981a2cc798e5754bc6970" integrity sha512-6CYPa+JP2ftfRU2qkDK+UTVeQYosOg/2GbcjIcKPHfinyOLPVGXu/ovN86RP49Re5ndJK1N0kuiidFFuepc4ZQ== -commander@2.19.0, commander@^2.19.0: +commander@2.19.0: version "2.19.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg== @@ -10526,7 +8970,7 @@ commander@2.9.0: dependencies: graceful-readlink ">= 1.0.0" -commander@^2.20.0: +commander@^2.12.1, commander@^2.19.0, commander@^2.20.0, commander@^2.8.1, commander@^2.9.0: version "2.20.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422" integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ== @@ -10608,34 +9052,14 @@ compress-commons@^2.1.1: normalize-path "^3.0.0" readable-stream "^2.3.6" -compressible@^2.0.12, compressible@~2.0.13: - version "2.0.13" - resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.13.tgz#0d1020ab924b2fdb4d6279875c7d6daba6baa7a9" - integrity sha1-DRAgq5JLL9tNYnmHXH1tq6a6p6k= - dependencies: - mime-db ">= 1.33.0 < 2" - -compressible@~2.0.16: +compressible@^2.0.12, compressible@~2.0.16: version "2.0.16" - resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.16.tgz#a49bf9858f3821b64ce1be0296afc7380466a77f" - integrity sha512-JQfEOdnI7dASwCuSPWIeVYwc/zMsu/+tRhoUvEfXz2gxOA2DNjmG5vhtFdBlhWPPGo+RdT9S3tgc/uH5qgDiiA== - dependencies: - mime-db ">= 1.38.0 < 2" - -compression@^1.7.0, compression@^1.7.1: - version "1.7.2" - resolved "http://registry.npmjs.org/compression/-/compression-1.7.2.tgz#aaffbcd6aaf854b44ebb280353d5ad1651f59a69" - integrity sha1-qv+81qr4VLROuygDU9WtFlH1mmk= - dependencies: - accepts "~1.3.4" - bytes "3.0.0" - compressible "~2.0.13" - debug "2.6.9" - on-headers "~1.0.1" - safe-buffer "5.1.1" - vary "~1.1.2" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.16.tgz#a49bf9858f3821b64ce1be0296afc7380466a77f" + integrity sha512-JQfEOdnI7dASwCuSPWIeVYwc/zMsu/+tRhoUvEfXz2gxOA2DNjmG5vhtFdBlhWPPGo+RdT9S3tgc/uH5qgDiiA== + dependencies: + mime-db ">= 1.38.0 < 2" -compression@^1.7.4: +compression@^1.7.0, compression@^1.7.1, compression@^1.7.4: version "1.7.4" resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== @@ -10908,18 +9332,13 @@ conventional-recommended-bump@^5.0.0: meow "^4.0.0" q "^1.5.1" -convert-source-map@1.6.0, convert-source-map@^1.5.0: +convert-source-map@1.6.0, convert-source-map@^1.1.0, convert-source-map@^1.4.0, convert-source-map@^1.5.0, convert-source-map@^1.5.1: version "1.6.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" integrity sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A== dependencies: safe-buffer "~5.1.1" -convert-source-map@^1.1.0, convert-source-map@^1.4.0, convert-source-map@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" - integrity sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU= - convert-to-spaces@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/convert-to-spaces/-/convert-to-spaces-1.0.2.tgz#7e3e48bbe6d997b1417ddca2868204b4d3d85715" @@ -11005,7 +9424,7 @@ core-js@3.0.0-beta.13: resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.0.0-beta.13.tgz#7732c69be5e4758887917235fe7c0352c4cb42a1" integrity sha512-16Q43c/3LT9NyePUJKL8nRIQgYWjcBhjJSMWg96PVSxoS0PeE0NHitPI3opBrs9MGGHjte1KoEVr9W63YKlTXQ== -core-js@3.3.3: +core-js@3.3.3, core-js@^3.2.0: version "3.3.3" resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.3.3.tgz#b7048d3c6c1a52b5fe55a729c1d4ccdffe0891bb" integrity sha512-0xmD4vUJRY8nfLyV9zcpC17FtSie5STXzw+HyYw2t8IIvmDnbq7RJUULECCo+NstpJtwK9kx8S+898iyqgeUow== @@ -11015,35 +9434,17 @@ core-js@^1.0.0: resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" integrity sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY= -core-js@^2.0.0, core-js@^2.2.2, core-js@^2.4.0, core-js@^2.4.1, core-js@^2.5.0: - version "2.5.5" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.5.tgz#b14dde936c640c0579a6b50cabcc132dd6127e3b" - integrity sha1-sU3ek2xkDAV5prUMq8wTLdYSfjs= - -core-js@^2.5.7: +core-js@^2.0.0, core-js@^2.2.2, core-js@^2.4.0, core-js@^2.4.1, core-js@^2.5.0, core-js@^2.5.7: version "2.5.7" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.7.tgz#f972608ff0cead68b841a16a932d0b183791814e" integrity sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw== -core-js@^3.2.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.2.1.tgz#cd41f38534da6cc59f7db050fe67307de9868b09" - integrity sha512-Qa5XSVefSVPRxy2XfUC13WbvqkxhkwB3ve+pgCQveNgYzbM/UxZeu1dcOX/xr4UmfUd+muuvsaxilQzCyUurMw== - core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= -cors@^2.8.1, cors@^2.8.4: - version "2.8.4" - resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.4.tgz#2bd381f2eb201020105cd50ea59da63090694686" - integrity sha1-K9OB8usgECAQXNUOpZ2mMJBpRoY= - dependencies: - object-assign "^4" - vary "^1" - -cors@^2.8.5: +cors@^2.8.1, cors@^2.8.4, cors@^2.8.5: version "2.8.5" resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== @@ -11061,16 +9462,7 @@ cosmiconfig@^4.0.0: parse-json "^4.0.0" require-from-string "^2.0.1" -cosmiconfig@^5.0.5: - version "5.0.6" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.0.6.tgz#dca6cf680a0bd03589aff684700858c81abeeb39" - integrity sha512-6DWfizHriCrFWURP1/qyhsiFvYdlJzbCzmtFWh744+KyWsJo5+kPzUZZaMRSSItoYc0pxFX7gEO7ZC1/gN/7AQ== - dependencies: - is-directory "^0.3.1" - js-yaml "^3.9.0" - parse-json "^4.0.0" - -cosmiconfig@^5.0.7, cosmiconfig@^5.1.0, cosmiconfig@^5.2.1: +cosmiconfig@^5.0.5, cosmiconfig@^5.0.7, cosmiconfig@^5.1.0, cosmiconfig@^5.2.1: version "5.2.1" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== @@ -11156,7 +9548,7 @@ create-react-context@0.2.3: fbjs "^0.8.0" gud "^1.0.0" -cross-env@5.2.0: +cross-env@5.2.0, cross-env@^5.1.3, cross-env@^5.1.6: version "5.2.0" resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-5.2.0.tgz#6ecd4c015d5773e614039ee529076669b9d126f2" integrity sha512-jtdNFfFW1hB7sMhr/H6rW1Z45LFqyI431m3qU6bFXcQ3Eh7LtBuG3h74o7ohHZ3crrRkkqHlo4jYHFPcjroANg== @@ -11164,14 +9556,6 @@ cross-env@5.2.0: cross-spawn "^6.0.5" is-windows "^1.0.0" -cross-env@^5.1.3, cross-env@^5.1.6: - version "5.1.6" - resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-5.1.6.tgz#0dc05caf945b24e4b9e3b12871fe0e858d08b38d" - integrity sha512-VWTDq+G4v383SzgRS7jsAVWqEWF0aKZpDz1GVjhONvPRgHB1LnxP2sXUVFKbykHkPSnfRKS8YdiDevWFwZmQ9g== - dependencies: - cross-spawn "^5.1.0" - is-windows "^1.0.0" - cross-fetch@2.2.2, cross-fetch@3.0.4, cross-fetch@^2.1.0, cross-fetch@^2.1.1, cross-fetch@^2.2.2, cross-fetch@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.0.2.tgz#b7136491967031949c7f86b15903aef4fa3f1768" @@ -11228,13 +9612,6 @@ cryptiles@2.x.x: dependencies: boom "2.x.x" -cryptiles@3.x.x: - version "3.1.2" - resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-3.1.2.tgz#a89fbb220f5ce25ec56e8c4aa8a4fd7b5b0d29fe" - integrity sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4= - dependencies: - boom "5.x.x" - crypto-browserify@3.12.0, crypto-browserify@^3.11.0: version "3.12.0" resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" @@ -11351,12 +9728,7 @@ cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": dependencies: cssom "0.3.x" -csstype@^2.2.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.4.1.tgz#ba35a94259cffc07ed022954737a1da690dcae2c" - integrity sha512-JuXYT9dt8xtpc4mwHSOYnZtQS3TmYVhmZDyXbppTid29krM8Eyn5CmsZjIDTSvzunvutYOBwQmnziR5vgFkJGw== - -csstype@^2.6.3: +csstype@^2.2.0, csstype@^2.6.3: version "2.6.3" resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.3.tgz#b701e5968245bf9b08d54ac83d00b624e622a9fa" integrity sha512-rINUZXOkcBmoHWEyu7JdHu5JMzkGRoMX4ov9830WNgxf5UYxcBUO0QTKAqeJ5EZfSdlrcJYkC8WwfVW7JYi4yg== @@ -11513,12 +9885,7 @@ dayjs@^1.8.15: resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.8.16.tgz#2a3771de537255191b947957af2fd90012e71e64" integrity sha512-XPmqzWz/EJiaRHjBqSJ2s6hE/BUoCIHKgdS2QPtTQtKcS9E4/Qn0WomoH1lXanWCzri+g7zPcuNV4aTZ8PMORQ== -debounce@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.1.0.tgz#6a1a4ee2a9dc4b7c24bb012558dbcdb05b37f408" - integrity sha512-ZQVKfRVlwRfD150ndzEK8M90ABT+Y/JQKs4Y7U4MXdpuoUkkrr4DwKbVux3YjylA5bUMUj0Nc3pMxPJX6N2QQQ== - -debounce@^1.2.0: +debounce@^1.1.0, debounce@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.0.tgz#44a540abc0ea9943018dc0eaa95cce87f65cd131" integrity sha512-mYtLl1xfZLi1m4RtQYlZgJUNQjl4ZxVnHzIR8nLLgi4q1YT8o/WM+MK/f8yfcc9s5Ir5zRaPZyZU6xs1Syoocg== @@ -11535,21 +9902,21 @@ debug@2.6.8: dependencies: ms "2.0.0" -debug@2.6.9, debug@^2.1.2, debug@^2.1.3, debug@^2.2.0, debug@^2.3.3, debug@^2.6.6, debug@^2.6.8, debug@^2.6.9: +debug@2.6.9, debug@^2.1.3, debug@^2.2.0, debug@^2.3.3, debug@^2.6.6, debug@^2.6.8, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" -debug@3.1.0, debug@^3.0.1, debug@^3.1.0: +debug@3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== dependencies: ms "2.0.0" -debug@3.2.6, debug@^3.2.5, debug@^3.2.6: +debug@3.2.6, debug@^3.0.1, debug@^3.1.0, debug@^3.2.5, debug@^3.2.6: version "3.2.6" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== @@ -11588,13 +9955,6 @@ decamelize@^1.0.0, decamelize@^1.1.0, decamelize@^1.1.1, decamelize@^1.1.2, deca resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= -decamelize@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-2.0.0.tgz#656d7bbc8094c4c788ea53c5840908c9c7d063c7" - integrity sha512-Ikpp5scV3MSYxY39ymh45ZLEecsTdv/Xj2CaQfI8RLMuwi7XvjX9H/fhraiSuU+C5w5NTDu4ZU72xNiZnurBPg== - dependencies: - xregexp "4.0.0" - decimal.js@10.0.1, decimal.js@^10.0.0: version "10.0.1" resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.0.1.tgz#d04b16b277f0f9af09671cee225c4882e8857c58" @@ -11701,7 +10061,7 @@ deep-equal@^1.0.0, deep-equal@^1.0.1, deep-equal@~1.0.1: resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" integrity sha1-9dJgKStmDghO/0zbyfCK0yR0SLU= -deep-extend@^0.5.1, deep-extend@^0.6.0, deep-extend@~0.4.0: +deep-extend@^0.5.1, deep-extend@^0.6.0: version "0.5.1" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.5.1.tgz#b894a9dd90d3023fbf1c55a394fb858eb2066f1f" integrity sha512-N8vBdOa+DF7zkRrDCsaOXoCs/E2fJfx9B9MrKnnSiHNh4ws7eSys6YQE4KvT1cecKmOASYQBhbKjeuDD9lT81w== @@ -11777,15 +10137,7 @@ deferred-leveldown@~4.0.0: abstract-leveldown "~5.0.0" inherits "^2.0.3" -define-properties@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94" - integrity sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ= - dependencies: - foreach "^2.0.5" - object-keys "^1.0.8" - -define-properties@^1.1.3: +define-properties@^1.1.2, define-properties@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== @@ -11878,11 +10230,6 @@ denque@^1.4.1: resolved "https://registry.yarnpkg.com/denque/-/denque-1.4.1.tgz#6744ff7641c148c3f8a69c307e51235c1f4a37cf" integrity sha512-OfzPuSZKGcgr96rf1oODnfjqBFmr1DVoc/TrItj3Ohe0Ah1C5WX5Baquw/9U9KovnQ88EqmJbD66rKYUQYN1tQ== -depd@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359" - integrity sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k= - depd@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" @@ -12324,17 +10671,7 @@ duplexer@^0.1.1, 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.5.0, duplexify@^3.5.3: - version "3.5.4" - resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.5.4.tgz#4bb46c1796eabebeec4ca9a2e66b808cb7a3d8b4" - integrity sha512-JzYSLYMhoVVBe8+mbHQ4KgpvHpm0DZpJuL8PY93Vyv1fW7jYJ90LoXa1di/CVbJM+TgMs91rbDapE/RNIfnJsA== - dependencies: - end-of-stream "^1.0.0" - inherits "^2.0.1" - readable-stream "^2.0.0" - stream-shift "^1.0.0" - -duplexify@^3.6.0: +duplexify@^3.4.2, duplexify@^3.5.0, 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== @@ -12376,13 +10713,6 @@ ecc-jsbn@~0.1.1: dependencies: jsbn "~0.1.0" -ecdsa-sig-formatter@1.0.10: - version "1.0.10" - resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.10.tgz#1c595000f04a8897dfb85000892a0f4c33af86c3" - integrity sha1-HFlQAPBKiJffuFAAiSoPTDOvhsM= - dependencies: - safe-buffer "^5.0.1" - ecdsa-sig-formatter@1.0.11: version "1.0.11" resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf" @@ -12390,14 +10720,6 @@ ecdsa-sig-formatter@1.0.11: dependencies: safe-buffer "^5.0.1" -ecdsa-sig-formatter@1.0.9: - version "1.0.9" - resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.9.tgz#4bc926274ec3b5abb5016e7e1d60921ac262b2a1" - integrity sha1-S8kmJ07Dtau1AW5+HWCSGsJisqE= - dependencies: - base64url "^2.0.0" - safe-buffer "^5.0.1" - ecurve@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/ecurve/-/ecurve-1.0.6.tgz#dfdabbb7149f8d8b78816be5a7d5b83fcf6de797" @@ -12441,21 +10763,11 @@ electron-download@^3.0.1: semver "^5.3.0" sumchecker "^1.2.0" -electron-to-chromium@^1.3.191: +electron-to-chromium@^1.3.191, electron-to-chromium@^1.3.47: version "1.3.216" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.216.tgz#7eda27727ba5412c96729df8fceb35bf503eb65a" integrity sha512-G2rJKCdDLTaAP56WKMj0mcr7jtr3LBBL2EaF73DamfFpvcl0PzKUIaUocPP8NLu9s/RbbHLMGkbFOkDRK5PQIQ== -electron-to-chromium@^1.3.47: - version "1.3.188" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.188.tgz#e28e1afe4bb229989e280bfd3b395c7ec03c8b7a" - integrity sha512-tEQcughYIMj8WDMc59EGEtNxdGgwal/oLLTDw+NEqJRJwGflQvH3aiyiexrWeZOETP4/ko78PVr6gwNhdozvuQ== - -electron-to-chromium@^1.3.96: - version "1.3.97" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.97.tgz#61918815c3baa03cdf42e91e32fae2f7c5c29b65" - integrity sha512-cElMxsoUl8BoY+DnTNXebdVuDz/l0HS5ijpq1uUcHNMrzFiQRKmADn39luHVIaeISO8qtFbNmqhSBU/BQCHwig== - electron@^1.8.7: version "1.8.8" resolved "https://registry.yarnpkg.com/electron/-/electron-1.8.8.tgz#a90cddb075291f49576993e6f5c8bb4439301cae" @@ -12480,7 +10792,7 @@ elliptic@6.3.3: hash.js "^1.0.0" inherits "^2.0.1" -elliptic@=6.4.0, elliptic@^6.0.0, elliptic@^6.4.0: +elliptic@=6.4.0: version "6.4.0" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df" integrity sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8= @@ -12503,7 +10815,7 @@ elliptic@^3.1.0: hash.js "^1.0.0" inherits "^2.0.1" -elliptic@^6.2.3, elliptic@^6.4.1: +elliptic@^6.0.0, elliptic@^6.2.3, elliptic@^6.4.0, elliptic@^6.4.1: version "6.4.1" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.1.tgz#c2d0b7776911b86722c632c3c06c60f2f819939a" integrity sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ== @@ -12738,18 +11050,7 @@ errorhandler@^1.5.0: accepts "~1.3.3" escape-html "~1.0.3" -es-abstract@^1.10.0, es-abstract@^1.5.0, es-abstract@^1.6.1: - version "1.12.0" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.12.0.tgz#9dbbdd27c6856f0001421ca18782d786bf8a6165" - integrity sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA== - dependencies: - es-to-primitive "^1.1.1" - function-bind "^1.1.1" - has "^1.0.1" - is-callable "^1.1.3" - is-regex "^1.0.4" - -es-abstract@^1.11.0, es-abstract@^1.12.0, es-abstract@^1.7.0: +es-abstract@^1.10.0, es-abstract@^1.11.0, es-abstract@^1.12.0, es-abstract@^1.5.0, es-abstract@^1.5.1, es-abstract@^1.7.0: version "1.13.0" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.13.0.tgz#ac86145fdd5099d8dd49558ccba2eaf9b88e24e9" integrity sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg== @@ -12761,26 +11062,6 @@ es-abstract@^1.11.0, es-abstract@^1.12.0, es-abstract@^1.7.0: is-regex "^1.0.4" object-keys "^1.0.12" -es-abstract@^1.5.1: - version "1.11.0" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.11.0.tgz#cce87d518f0496893b1a30cd8461835535480681" - integrity sha512-ZnQrE/lXTTQ39ulXZ+J1DTFazV9qBy61x2bY071B+qGco8Z8q1QddsLdt/EF8Ai9hcWH72dWS0kFqXLxOxqslA== - dependencies: - es-to-primitive "^1.1.1" - function-bind "^1.1.1" - has "^1.0.1" - is-callable "^1.1.3" - is-regex "^1.0.4" - -es-to-primitive@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d" - integrity sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0= - dependencies: - is-callable "^1.1.1" - is-date-object "^1.0.1" - is-symbol "^1.0.1" - es-to-primitive@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377" @@ -12790,25 +11071,7 @@ es-to-primitive@^1.2.0: is-date-object "^1.0.1" is-symbol "^1.0.2" -es5-ext@^0.10.14, es5-ext@^0.10.35, es5-ext@^0.10.9, es5-ext@~0.10.14: - version "0.10.42" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.42.tgz#8c07dd33af04d5dcd1310b5cef13bea63a89ba8d" - integrity sha512-AJxO1rmPe1bDEfSR6TJ/FgMFYuTBhR5R57KW58iCkYACMyFbrkqVyzXSurYoScDGvgyMpk7uRF/lPUPPTmsRSA== - dependencies: - es6-iterator "~2.0.3" - es6-symbol "~3.1.1" - next-tick "1" - -es5-ext@^0.10.45, es5-ext@^0.10.46, es5-ext@~0.10.2, es5-ext@~0.10.46: - version "0.10.46" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.46.tgz#efd99f67c5a7ec789baa3daa7f79870388f7f572" - integrity sha512-24XxRvJXNFwEMpJb3nOkiRJKRoupmjYmOPVlI65Qy2SrtxwOTB+g6ODjBKOtwEHbYrhWRty9xxOWLNdClT2djw== - dependencies: - es6-iterator "~2.0.3" - es6-symbol "~3.1.1" - next-tick "1" - -es5-ext@^0.10.50: +es5-ext@^0.10.35, es5-ext@^0.10.45, es5-ext@^0.10.46, es5-ext@^0.10.50, es5-ext@^0.10.9, es5-ext@~0.10.14, es5-ext@~0.10.2, es5-ext@~0.10.46: version "0.10.51" resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.51.tgz#ed2d7d9d48a12df86e0299287e93a09ff478842f" integrity sha512-oRpWzM2WcLHVKpnrcyB7OW8j/s67Ba04JCm0WnNv3RiABSvs7mrQlutB8DBv793gKcp0XENR8Il8WxGTlZ73gQ== @@ -12836,12 +11099,7 @@ es6-promise@^3.2.1: resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613" integrity sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM= -es6-promise@^4.0.3: - version "4.2.4" - resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.4.tgz#dc4221c2b16518760bd8c39a52d8f356fc00ed29" - integrity sha512-/NdNZVJg+uZgtm9eS3O6lrOLYmQag2DjdEXuPaHlZ6RuVqgqaVZfgYCepEIKsLqwdQArOPtC3XzRLqGGfT8KQQ== - -es6-promise@^4.0.5: +es6-promise@^4.0.3, es6-promise@^4.0.5: version "4.2.6" resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.6.tgz#b685edd8258886365ea62b57d30de28fadcd974f" integrity sha512-aRVgGdnmW2OiySVPUC9e6m+plolMAJKjZnQlCwNSuK5yQ0JN61DZSO1X1Ufd1foqWRAlig0rhduTCHe7sVtK5Q== @@ -12878,7 +11136,7 @@ es6-template@^1.0.4: mkdirp "^0.5.1" sliced "^1.0.1" -es6-weak-map@^2.0.1: +es6-weak-map@^2.0.1, es6-weak-map@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.3.tgz#b6da1f16cc2cc0d9be43e6bdbfc5e7dfcdf31d53" integrity sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA== @@ -12888,16 +11146,6 @@ es6-weak-map@^2.0.1: es6-iterator "^2.0.3" es6-symbol "^3.1.1" -es6-weak-map@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772f92d96f" - integrity sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8= - dependencies: - d "1" - es5-ext "^0.10.14" - es6-iterator "^2.0.1" - es6-symbol "^3.1.1" - escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" @@ -12930,7 +11178,7 @@ escodegen@1.8.x: optionalDependencies: source-map "~0.2.0" -escodegen@1.x.x: +escodegen@1.x.x, escodegen@^1.9.0: version "1.11.0" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.11.0.tgz#b27a9389481d5bfd5bec76f7bb1eb3f8f4556589" integrity sha512-IeMV45ReixHS53K/OmfKAIztN/igDHzTJUhZM3k1jMhIZWjk45SMwAtBsEXiJp3vSPmTcu6CXn7mDvFHRN66fw== @@ -12942,18 +11190,6 @@ escodegen@1.x.x: optionalDependencies: source-map "~0.6.1" -escodegen@^1.9.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.9.1.tgz#dbae17ef96c8e4bedb1356f4504fa4cc2f7cb7e2" - integrity sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q== - dependencies: - esprima "^3.1.3" - estraverse "^4.2.0" - esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.6.1" - eslint-plugin-eslint-comments@^3.1.1: version "3.1.2" resolved "https://registry.yarnpkg.com/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-3.1.2.tgz#4ef6c488dbe06aa1627fea107b3e5d059fc8a395" @@ -13020,15 +11256,7 @@ eslint-scope@3.7.1: esrecurse "^4.1.0" estraverse "^4.1.1" -eslint-scope@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.0.tgz#50bf3071e9338bcdc43331794a0cb533f0136172" - integrity sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA== - dependencies: - esrecurse "^4.1.0" - estraverse "^4.1.1" - -eslint-scope@^4.0.3: +eslint-scope@^4.0.0, eslint-scope@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== @@ -13124,12 +11352,7 @@ esprima@3.x.x, esprima@^3.1.3: resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" integrity sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM= -esprima@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" - integrity sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw== - -esprima@~4.0.0: +esprima@^4.0.0, esprima@~4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== @@ -13364,18 +11587,6 @@ eth-query@^2.0.2, eth-query@^2.1.0, eth-query@^2.1.2: json-rpc-random-id "^1.0.0" xtend "^4.0.1" -eth-sig-util@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/eth-sig-util/-/eth-sig-util-2.1.2.tgz#9b357395b5ca07fae6b430d3e534cf0a0f1df118" - integrity sha512-bNgt7txkEmaNlLf+PrbwYIdp4KRkB3E7hW0/QwlBpgv920pVVyQnF0evoovfiRveNKM4OrtPYZTojjmsfuCUOw== - dependencies: - buffer "^5.2.1" - elliptic "^6.4.0" - ethereumjs-abi "0.6.5" - ethereumjs-util "^5.1.1" - tweetnacl "^1.0.0" - tweetnacl-util "^0.15.0" - eth-sig-util@2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/eth-sig-util/-/eth-sig-util-2.2.0.tgz#769fa3d296b450f6618dedeefe076642c923a16f" @@ -13432,15 +11643,7 @@ ethereum-common@^0.0.18: resolved "https://registry.yarnpkg.com/ethereum-common/-/ethereum-common-0.0.18.tgz#2fdc3576f232903358976eb39da783213ff9523f" integrity sha1-L9w1dvIykDNYl26znaeDIT/5Uj8= -ethereum-types@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ethereum-types/-/ethereum-types-2.1.2.tgz#7398873e0eede1dd0956a134e1037032f6ed3c14" - integrity sha512-JsQnroPOsZ81yN75HVzvobosSxjr/59oEdYnydTgnV13Fg9PwS078CtPyBzARXequBl2Hnz4h7f3VF64u8P01A== - dependencies: - "@types/node" "*" - bignumber.js "~8.0.2" - -ethereum-types@^2.1.5: +ethereum-types@^2.1.2, ethereum-types@^2.1.5: version "2.1.5" resolved "https://registry.yarnpkg.com/ethereum-types/-/ethereum-types-2.1.5.tgz#477e2741837af07286cb3c48f3443a8bac2afb4b" integrity sha512-2aX0x5iUOYgfuaA72YIS0j6GaD0pewcTNZistsPPCFJd4K3JzbJmyD6U4DdCKHWeEslt+NCUx4DgaRq1GMJHvw== @@ -13463,15 +11666,6 @@ ethereumjs-abi@0.6.7, "ethereumjs-abi@git+https://github.com/ethereumjs/ethereum bn.js "^4.11.8" ethereumjs-util "^6.0.0" -ethereumjs-account@2.0.5, ethereumjs-account@^2.0.3: - version "2.0.5" - resolved "https://registry.yarnpkg.com/ethereumjs-account/-/ethereumjs-account-2.0.5.tgz#eeafc62de544cb07b0ee44b10f572c9c49e00a84" - integrity sha512-bgDojnXGjhMwo6eXQC0bY6UK2liSFUSMwwylOmQvZbSl/D7NXQ3+vrGO46ZeOgjGfxXmgIeVNDIiHw7fNZM4VA== - dependencies: - ethereumjs-util "^5.0.0" - rlp "^2.0.0" - safe-buffer "^5.1.1" - ethereumjs-account@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ethereumjs-account/-/ethereumjs-account-3.0.0.tgz#728f060c8e0c6e87f1e987f751d3da25422570a9" @@ -13481,16 +11675,14 @@ ethereumjs-account@3.0.0: rlp "^2.2.1" safe-buffer "^5.1.1" -ethereumjs-block@2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/ethereumjs-block/-/ethereumjs-block-2.1.0.tgz#71d1b19e18061f14cf6371bf34ba31a359931360" - integrity sha512-ip+x4/7hUInX+TQfhEKsQh9MJK1Dbjp4AuPjf1UdX3udAV4beYD4EMCNIPzBLCsGS8WQZYXLpo83tVTISYNpow== +ethereumjs-account@^2.0.3: + version "2.0.5" + resolved "https://registry.yarnpkg.com/ethereumjs-account/-/ethereumjs-account-2.0.5.tgz#eeafc62de544cb07b0ee44b10f572c9c49e00a84" + integrity sha512-bgDojnXGjhMwo6eXQC0bY6UK2liSFUSMwwylOmQvZbSl/D7NXQ3+vrGO46ZeOgjGfxXmgIeVNDIiHw7fNZM4VA== dependencies: - async "^2.0.1" - ethereumjs-common "^0.6.0" - ethereumjs-tx "^1.2.2" ethereumjs-util "^5.0.0" - merkle-patricia-tree "^2.1.2" + rlp "^2.0.0" + safe-buffer "^5.1.1" ethereumjs-block@2.2.0, ethereumjs-block@~2.2.0: version "2.2.0" @@ -13530,11 +11722,6 @@ ethereumjs-blockchain@^3.4.0: safe-buffer "^5.1.2" semaphore "^1.1.0" -ethereumjs-common@^0.6.0: - version "0.6.1" - resolved "https://registry.yarnpkg.com/ethereumjs-common/-/ethereumjs-common-0.6.1.tgz#ec98edf315a7f107afb6acc48e937a8266979fae" - integrity sha512-4jOrfDu9qOBTTGGb3zrfT1tE1Hyc6a8LJpEk0Vk9AYlLkBY7crjVICyJpRvjNI+KLDMpMITMw3eWVZOLMtZdhw== - ethereumjs-common@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/ethereumjs-common/-/ethereumjs-common-1.1.0.tgz#5ec9086c314d619d8f05e79a0525829fcb0e93cb" @@ -13548,19 +11735,6 @@ ethereumjs-tx@1.3.7, ethereumjs-tx@^1.1.1, ethereumjs-tx@^1.2.0, ethereumjs-tx@^ ethereum-common "^0.0.18" ethereumjs-util "^5.0.0" -ethereumjs-util@5.2.0, ethereumjs-util@^5.0.0, ethereumjs-util@^5.0.1, ethereumjs-util@^5.1.1, ethereumjs-util@^5.1.2, ethereumjs-util@^5.1.3, ethereumjs-util@^5.1.5, ethereumjs-util@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz#3e0c0d1741471acf1036052d048623dee54ad642" - integrity sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA== - dependencies: - bn.js "^4.11.0" - create-hash "^1.1.2" - ethjs-util "^0.1.3" - keccak "^1.0.2" - rlp "^2.0.0" - safe-buffer "^5.1.1" - secp256k1 "^3.0.1" - ethereumjs-util@6.1.0, ethereumjs-util@^6.0.0: version "6.1.0" resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-6.1.0.tgz#e9c51e5549e8ebd757a339cc00f5380507e799c8" @@ -13585,6 +11759,19 @@ ethereumjs-util@^4.0.1, ethereumjs-util@^4.3.0: rlp "^2.0.0" secp256k1 "^3.0.1" +ethereumjs-util@^5.0.0, ethereumjs-util@^5.0.1, ethereumjs-util@^5.1.1, ethereumjs-util@^5.1.2, ethereumjs-util@^5.1.3, ethereumjs-util@^5.1.5, ethereumjs-util@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz#3e0c0d1741471acf1036052d048623dee54ad642" + integrity sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA== + dependencies: + bn.js "^4.11.0" + create-hash "^1.1.2" + ethjs-util "^0.1.3" + keccak "^1.0.2" + rlp "^2.0.0" + safe-buffer "^5.1.1" + secp256k1 "^3.0.1" + ethereumjs-util@~6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-6.0.0.tgz#f14841c182b918615afefd744207c7932c8536c0" @@ -13598,15 +11785,16 @@ ethereumjs-util@~6.0.0: safe-buffer "^5.1.1" secp256k1 "^3.0.1" -ethereumjs-vm@2.6.0, ethereumjs-vm@^2.0.2, ethereumjs-vm@^2.1.0, ethereumjs-vm@^2.3.4, ethereumjs-vm@^2.4.0, ethereumjs-vm@^2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/ethereumjs-vm/-/ethereumjs-vm-2.6.0.tgz#76243ed8de031b408793ac33907fb3407fe400c6" - integrity sha512-r/XIUik/ynGbxS3y+mvGnbOKnuLo40V5Mj1J25+HEO63aWYREIqvWeRO/hnROlMBE5WoniQmPmhiaN0ctiHaXw== +ethereumjs-vm@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ethereumjs-vm/-/ethereumjs-vm-3.0.0.tgz#70fea2964a6797724b0d93fe080f9984ad18fcdd" + integrity sha512-lNu+G/RWPRCrQM5s24MqgU75PEGiAhL4Ombw0ew6m08d+amsxf/vGAb98yDNdQqqHKV6JbwO/tCGfdqXGI6Cug== dependencies: async "^2.1.2" async-eventemitter "^0.2.2" ethereumjs-account "^2.0.3" ethereumjs-block "~2.2.0" + ethereumjs-blockchain "^3.4.0" ethereumjs-common "^1.1.0" ethereumjs-util "^6.0.0" fake-merkle-patricia-tree "^1.0.1" @@ -13615,16 +11803,15 @@ ethereumjs-vm@2.6.0, ethereumjs-vm@^2.0.2, ethereumjs-vm@^2.1.0, ethereumjs-vm@^ rustbn.js "~0.2.0" safe-buffer "^5.1.1" -ethereumjs-vm@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ethereumjs-vm/-/ethereumjs-vm-3.0.0.tgz#70fea2964a6797724b0d93fe080f9984ad18fcdd" - integrity sha512-lNu+G/RWPRCrQM5s24MqgU75PEGiAhL4Ombw0ew6m08d+amsxf/vGAb98yDNdQqqHKV6JbwO/tCGfdqXGI6Cug== +ethereumjs-vm@^2.0.2, ethereumjs-vm@^2.1.0, ethereumjs-vm@^2.3.4, ethereumjs-vm@^2.4.0, ethereumjs-vm@^2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/ethereumjs-vm/-/ethereumjs-vm-2.6.0.tgz#76243ed8de031b408793ac33907fb3407fe400c6" + integrity sha512-r/XIUik/ynGbxS3y+mvGnbOKnuLo40V5Mj1J25+HEO63aWYREIqvWeRO/hnROlMBE5WoniQmPmhiaN0ctiHaXw== dependencies: async "^2.1.2" async-eventemitter "^0.2.2" ethereumjs-account "^2.0.3" ethereumjs-block "~2.2.0" - ethereumjs-blockchain "^3.4.0" ethereumjs-common "^1.1.0" ethereumjs-util "^6.0.0" fake-merkle-patricia-tree "^1.0.1" @@ -13633,20 +11820,6 @@ ethereumjs-vm@3.0.0: rustbn.js "~0.2.0" safe-buffer "^5.1.1" -ethereumjs-wallet@0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/ethereumjs-wallet/-/ethereumjs-wallet-0.6.2.tgz#67244b6af3e8113b53d709124b25477b64aeccda" - integrity sha512-DHEKPV9lYORM7dL8602dkb+AgdfzCYz2lxpdYQoD3OwG355LLDuivW9rGuLpDMCry/ORyBYV6n+QCo/71SwACg== - dependencies: - aes-js "^3.1.1" - bs58check "^2.1.2" - ethereumjs-util "^5.2.0" - hdkey "^1.0.0" - safe-buffer "^5.1.2" - scrypt.js "^0.2.0" - utf8 "^3.0.0" - uuid "^3.3.2" - ethereumjs-wallet@0.6.3, ethereumjs-wallet@^0.6.0: version "0.6.3" resolved "https://registry.yarnpkg.com/ethereumjs-wallet/-/ethereumjs-wallet-0.6.3.tgz#b0eae6f327637c2aeb9ccb9047b982ac542e6ab1" @@ -13694,23 +11867,7 @@ ethers@4.0.0-beta.3: uuid "2.0.1" xmlhttprequest "1.8.0" -ethers@^4.0.0-beta.1, ethers@^4.0.27: - version "4.0.28" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-4.0.28.tgz#74d9acb57f4ede3337c8d60476b38d0fe646af01" - integrity sha512-5JTHrPoFLqf+xCAI3pKwXSOgWBSJJoAUdPtPLr1ZlKbSKiIFMkPlRNovmZS3jhIw5sHW1YoVWOaJ6ZR2gKRbwg== - dependencies: - "@types/node" "^10.3.2" - aes-js "3.0.0" - bn.js "^4.4.0" - elliptic "6.3.3" - hash.js "1.1.3" - js-sha3 "0.5.7" - scrypt-js "2.0.4" - setimmediate "1.0.4" - uuid "2.0.1" - xmlhttprequest "1.8.0" - -ethers@~4.0.4: +ethers@^4.0.0-beta.1, ethers@^4.0.27, ethers@~4.0.4: version "4.0.32" resolved "https://registry.yarnpkg.com/ethers/-/ethers-4.0.32.tgz#46378864cb3bf29b57c2effd17508b560743abf6" integrity sha512-r0k2tBNF6MYEsvwmINeP3VPppD/7eAZyiOk/ifDDawXGCKqr3iEQkPq6OZSDVD+4Jie38WPteS9thXzpn2+A5Q== @@ -13787,12 +11944,12 @@ eventemitter3@1.1.1: resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-1.1.1.tgz#47786bdaa087caf7b1b75e73abc5c7d540158cd0" integrity sha1-R3hr2qCHyvext15zq8XH1UAVjNA= -eventemitter3@3.1.0, eventemitter3@^3.0.0, eventemitter3@^3.1.0: +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== -eventemitter3@3.1.2: +eventemitter3@3.1.2, eventemitter3@^3.0.0, eventemitter3@^3.1.0: version "3.1.2" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.2.tgz#2d3d48f9c346698fce83a85d7d664e98535df6e7" integrity sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q== @@ -14110,7 +12267,7 @@ express-rate-limit@5.0.0: resolved "https://registry.yarnpkg.com/express-rate-limit/-/express-rate-limit-5.0.0.tgz#9a6f4cacc388c1a1da7ba2f65db69f7395e9b04e" integrity sha512-dhT57wqxfqmkOi4HM7NuT4Gd7gbUgSK2ocG27Y6lwm8lbOAw9XQfeANawGq8wLDtlGPO1ZgDj0HmKsykTxfFAg== -express@4.16.4, express@^4.16.4: +express@4.16.4: version "4.16.4" resolved "https://registry.yarnpkg.com/express/-/express-4.16.4.tgz#fddef61926109e24c515ea97fd2f1bdbf62df12e" integrity sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg== @@ -14146,7 +12303,7 @@ express@4.16.4, express@^4.16.4: utils-merge "1.0.1" vary "~1.1.2" -express@4.17.1, express@^4.17.1: +express@4.17.1, express@^4.14.0, express@^4.16.4, express@^4.17.1: version "4.17.1" resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== @@ -14182,42 +12339,6 @@ express@4.17.1, express@^4.17.1: utils-merge "1.0.1" vary "~1.1.2" -express@^4.14.0: - version "4.16.3" - resolved "https://registry.yarnpkg.com/express/-/express-4.16.3.tgz#6af8a502350db3246ecc4becf6b5a34d22f7ed53" - integrity sha1-avilAjUNsyRuzEvs9rWjTSL37VM= - dependencies: - accepts "~1.3.5" - array-flatten "1.1.1" - body-parser "1.18.2" - content-disposition "0.5.2" - content-type "~1.0.4" - cookie "0.3.1" - cookie-signature "1.0.6" - debug "2.6.9" - depd "~1.1.2" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - finalhandler "1.1.1" - fresh "0.5.2" - merge-descriptors "1.0.1" - methods "~1.1.2" - on-finished "~2.3.0" - parseurl "~1.3.2" - path-to-regexp "0.1.7" - proxy-addr "~2.0.3" - qs "6.5.1" - range-parser "~1.2.0" - safe-buffer "5.1.1" - send "0.16.2" - serve-static "1.13.2" - setprototypeof "1.1.0" - statuses "~1.4.0" - type-is "~1.6.16" - utils-merge "1.0.1" - vary "~1.1.2" - extend-shallow@^1.1.2: version "1.1.4" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-1.1.4.tgz#19d6bf94dfc09d76ba711f39b872d21ff4dd9071" @@ -14240,7 +12361,7 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2: assign-symbols "^1.0.0" is-extendable "^1.0.1" -extend@^3.0.0, extend@^3.0.1, extend@^3.0.2, extend@~3.0.0, extend@~3.0.1, extend@~3.0.2: +extend@^3.0.0, extend@^3.0.1, extend@^3.0.2, extend@~3.0.0, extend@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== @@ -14461,20 +12582,7 @@ fbjs-scripts@^1.1.0: semver "^5.1.0" through2 "^2.0.0" -fbjs@^0.8.0, fbjs@^0.8.9: - version "0.8.16" - resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.16.tgz#5e67432f550dc41b572bf55847b8aca64e5337db" - integrity sha1-XmdDL1UNxBtXK/VYR7ispk5TN9s= - dependencies: - core-js "^1.0.0" - isomorphic-fetch "^2.1.1" - loose-envify "^1.0.0" - object-assign "^4.1.0" - promise "^7.1.1" - setimmediate "^1.0.5" - ua-parser-js "^0.7.9" - -fbjs@^0.8.16, fbjs@^0.8.4: +fbjs@^0.8.0, fbjs@^0.8.4, fbjs@^0.8.9: version "0.8.17" resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.17.tgz#c4d598ead6949112653d6588b01a5cdcd9f90fdd" integrity sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90= @@ -14501,11 +12609,6 @@ fbjs@^1.0.0: setimmediate "^1.0.5" ua-parser-js "^0.7.18" -fclone@^1.0.11: - version "1.0.11" - resolved "https://registry.yarnpkg.com/fclone/-/fclone-1.0.11.tgz#10e85da38bfea7fc599341c296ee1d77266ee640" - integrity sha1-EOhdo4v+p/xZk0HClu4ddyZu5kA= - fd-slicer@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.0.1.tgz#8b5bcbd9ec327c5041bf9ab023fd6750f1177e65" @@ -14683,7 +12786,7 @@ find-babel-config@^1.1.0: json5 "^0.5.1" path-exists "^3.0.0" -find-cache-dir@2.0.0, find-cache-dir@^2.0.0: +find-cache-dir@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.0.0.tgz#4c1faed59f45184530fb9d7fa123a4d04a98472d" integrity sha512-LDUY6V1Xs5eFskUVYtIwatojt6+9xC9Chnlk/jYOOvn3FAFfSaWddxahDGyNHh0b2dMXa6YW2m0tk8TdVaXHlA== @@ -14956,15 +13059,7 @@ flow-stoplight@^1.0.0: resolved "https://registry.yarnpkg.com/flow-stoplight/-/flow-stoplight-1.0.0.tgz#4a292c5bcff8b39fa6cc0cb1a853d86f27eeff7b" integrity sha1-SiksW8/4s5+mzAyxqFPYbyfu/3s= -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" - integrity sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw== - dependencies: - inherits "^2.0.1" - readable-stream "^2.0.4" - -flush-write-stream@^1.0.2: +flush-write-stream@^1.0.0, flush-write-stream@^1.0.2: version "1.1.1" resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== @@ -14977,26 +13072,12 @@ fn-name@^2.0.0: resolved "https://registry.yarnpkg.com/fn-name/-/fn-name-2.0.1.tgz#5214d7537a4d06a4a301c0cc262feb84188002e7" integrity sha1-UhTXU3pNBqSjAcDMJi/rhBiAAuc= -follow-redirects@^1.3.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.4.1.tgz#d8120f4518190f55aac65bb6fc7b85fcd666d6aa" - integrity sha512-uxYePVPogtya1ktGnAAXOacnbIuRMB4dkvqeNz2qTtTQsuzSfbDolV+wMMKxAmCx0bLgAKLbBOkjItMbbkR1vg== - dependencies: - debug "^3.1.0" - fontfaceobserver@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fontfaceobserver/-/fontfaceobserver-2.1.0.tgz#e2705d293e2c585a6531c2a722905657317a2991" integrity sha512-ReOsO2F66jUa0jmv2nlM/s1MiutJx/srhAe2+TE8dJCMi02ZZOcCTxTCQFr3Yet+uODUtnr4Mewg+tNQ+4V1Ng== -for-each@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.2.tgz#2c40450b9348e97f281322593ba96704b9abd4d4" - integrity sha1-LEBFC5NI6X8oEyJZO6lnBLmr1NQ= - dependencies: - is-function "~1.0.0" - -for-each@~0.3.3: +for-each@^0.3.2, for-each@~0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== @@ -15030,12 +13111,7 @@ for-own@^1.0.0: foreach@2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.4.tgz#cc5d0d8ae1d46cc9a555c2682f910977859935df" - integrity sha1-zF0NiuHUbMmlVcJoL5EJd4WZNd8= - -foreach@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" - integrity sha1-C+4AUBiusmDQo6865ljdATbsG5k= + integrity sha1-zF0NiuHUbMmlVcJoL5EJd4WZNd8= foreground-child@^1.5.3, foreground-child@^1.5.6: version "1.5.6" @@ -15050,16 +13126,7 @@ forever-agent@~0.6.1: resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= -form-data@^2.2.0, form-data@^2.3.1, form-data@~2.3.1, form-data@~2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.2.tgz#4970498be604c20c005d4f5c23aecd21d6b49099" - integrity sha1-SXBJi+YEwgwAXU9cI67NIda0kJk= - dependencies: - asynckit "^0.4.0" - combined-stream "1.0.6" - mime-types "^2.1.12" - -form-data@^2.3.3: +form-data@^2.2.0, form-data@^2.3.1, form-data@^2.3.3, form-data@~2.3.2: version "2.3.3" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== @@ -15310,23 +13377,7 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= -fsevents@^1.0.0, fsevents@^1.1.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.3.tgz#08292982e7059f6674c93d8b829c1e8604979ac0" - integrity sha512-X+57O5YkDTiEQGiw8i7wYc2nQgweIekqkepI8Q3y4wVlurgBt2SuwxTeYUYMZIGpLZH3r/TsMjczCMXE5ZOt7Q== - dependencies: - nan "^2.9.2" - node-pre-gyp "^0.9.0" - -fsevents@^1.2.2: - version "1.2.7" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.7.tgz#4851b664a3783e52003b3c66eb0eee1074933aa4" - integrity sha512-Pxm6sI2MeBD7RdD12RYsqaP0nMiwx8eZBXCa6z2L+mRHm2DYrOYwihmhjpkdjUHwQhslWQjRpEgNq4XvBmaAuw== - dependencies: - nan "^2.9.2" - node-pre-gyp "^0.10.0" - -fsevents@^1.2.7: +fsevents@^1.0.0, fsevents@^1.2.2, fsevents@^1.2.7: version "1.2.9" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.9.tgz#3f5ed66583ccd6f400b5a00db6f7e861363e388f" integrity sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw== @@ -15369,7 +13420,7 @@ fstream-npm@~1.2.1: fstream-ignore "^1.0.0" inherits "2" -fstream@^1.0.0, fstream@~1.0.10, fstream@~1.0.11: +fstream@^1.0.0, fstream@^1.0.8, fstream@~1.0.10, fstream@~1.0.11: version "1.0.12" resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.12.tgz#4e8ba8ee2d48be4f7d0de505455548eae5932045" integrity sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg== @@ -15379,16 +13430,6 @@ fstream@^1.0.0, fstream@~1.0.10, fstream@~1.0.11: mkdirp ">=0.5 0" rimraf "2" -fstream@^1.0.8: - version "1.0.11" - resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" - integrity sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE= - dependencies: - graceful-fs "^4.1.2" - inherits "~2.0.0" - mkdirp ">=0.5 0" - rimraf "2" - ftp@~0.3.10: version "0.3.10" resolved "https://registry.yarnpkg.com/ftp/-/ftp-0.3.10.tgz#9197d861ad8142f3e63d5a83bfe4c59f7330885d" @@ -15397,7 +13438,7 @@ ftp@~0.3.10: readable-stream "1.1.x" xregexp "2.0.0" -function-bind@^1.0.2, function-bind@^1.1.0, function-bind@^1.1.1, function-bind@~1.1.1: +function-bind@^1.0.2, function-bind@^1.1.1, function-bind@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== @@ -15436,42 +13477,7 @@ fuzzysort@^1.1.4: resolved "https://registry.yarnpkg.com/fuzzysort/-/fuzzysort-1.1.4.tgz#a0510206ed44532cbb52cf797bf5a3cb12acd4ba" integrity sha512-JzK/lHjVZ6joAg3OnCjylwYXYVjRiwTY6Yb25LvfpJHK8bjisfnZJ5bY8aVWwTwCXgxPNgLAtmHL+Hs5q1ddLQ== -ganache-core@^2.5.3: - version "2.5.6" - resolved "https://registry.yarnpkg.com/ganache-core/-/ganache-core-2.5.6.tgz#dd2ce3ec6e86930f8662cf4985c778cdf9b6ea79" - integrity sha512-Xvi5iOa8TQMbYCpWVrjnUHuBWFRZl1hJeNaxnytM2uh08elVXuKgcDdH8g7j1+r6WgW2FQmoowj4K/m/G999XA== - dependencies: - abstract-leveldown "3.0.0" - async "2.6.1" - bip39 "2.5.0" - bn.js "4.11.8" - cachedown "1.0.0" - clone "2.1.2" - debug "3.1.0" - encoding-down "5.0.4" - eth-sig-util "2.1.2" - ethereumjs-abi "0.6.5" - ethereumjs-account "2.0.5" - ethereumjs-block "2.1.0" - ethereumjs-tx "1.3.7" - ethereumjs-util "5.2.0" - ethereumjs-vm "2.6.0" - heap "0.2.6" - level-sublevel "6.6.4" - levelup "3.1.1" - lodash "4.17.11" - merkle-patricia-tree "2.3.1" - rlp "2.1.0" - seedrandom "2.4.4" - source-map-support "0.5.9" - tmp "0.0.33" - web3-provider-engine "14.1.0" - websocket "1.0.26" - optionalDependencies: - ethereumjs-wallet "0.6.2" - web3 "1.0.0-beta.35" - -ganache-core@^2.6.0: +ganache-core@^2.5.3, ganache-core@^2.6.0: version "2.7.0" resolved "https://registry.yarnpkg.com/ganache-core/-/ganache-core-2.7.0.tgz#9897c7ad6ebe934e92f88e62fcf3c6cc1f1a807f" integrity sha512-oZBNb2pZlD/uMxHDYJp4SBfavwblcGyqNPiZBgilp2n1fO/rnZwEAcpKE+1Uq1sO27YxuKJosm3Jvr9NarOWGA== @@ -15544,16 +13550,7 @@ gauge@~2.7.3: strip-ansi "^3.0.1" wide-align "^1.1.0" -gaxios@^1.0.2, gaxios@^1.0.4, gaxios@^1.2.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/gaxios/-/gaxios-1.5.1.tgz#11b6fa57dbc9aa2d88de9069ee6f1a61615a707d" - integrity sha512-gqVZy/mvjx/VzSlr3ZwRvG7fx8ZxtZiSTHvEBB/enBu0ccsnt0Vr0PqgyTuKU7cGAa6BSH09Oy0UeN85lT61Fg== - dependencies: - extend "^3.0.2" - https-proxy-agent "^2.2.1" - node-fetch "^2.2.0" - -gaxios@^1.5.0: +gaxios@^1.0.2, gaxios@^1.0.4, gaxios@^1.2.1, gaxios@^1.5.0: version "1.8.2" resolved "https://registry.yarnpkg.com/gaxios/-/gaxios-1.8.2.tgz#8bc29dab0f5e296cada2c9d3ebbd0857410df15f" integrity sha512-Mp6zmABg+0CxJA4b7DEWQ4ZWQzEaWxRNmHAcvCO+HU3dfoFTY925bdpZrTkLWPEtKjS9RBJKrJInzb+VtvAVYA== @@ -15588,15 +13585,6 @@ gcp-metadata@^0.3.0: extend "^3.0.0" retry-request "^3.0.0" -gcp-metadata@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/gcp-metadata/-/gcp-metadata-0.7.0.tgz#6c35dbb52bda32a427bb9c98f54237ddd1b5406f" - integrity sha512-ffjC09amcDWjh3VZdkDngIo7WoluyC5Ag9PAYxZbmQLOLNI8lvPtoKTSCyU54j2gwy5roZh6sSMTfkY2ct7K3g== - dependencies: - axios "^0.18.0" - extend "^3.0.1" - retry-axios "0.3.2" - gcp-metadata@^0.9.3: version "0.9.3" resolved "https://registry.yarnpkg.com/gcp-metadata/-/gcp-metadata-0.9.3.tgz#1f9d7495f7460a14526481f29e11596dd563dd26" @@ -15613,18 +13601,6 @@ gcp-metadata@^3.0.0: gaxios "^2.0.1" json-bigint "^0.3.0" -gcs-resumable-upload@^0.13.0: - version "0.13.0" - resolved "https://registry.yarnpkg.com/gcs-resumable-upload/-/gcs-resumable-upload-0.13.0.tgz#706e5c835e4c53cd5527b86013c9f4dda4bfcb14" - integrity sha512-hrSYPFJWyx8FDLJEK3XeqbNcCjkRqcuKSaUxL1RpwEAWAxtV+AdUH+NX3n7st/U6/JddQkdb1mmWAy3jgRDflw== - dependencies: - axios "^0.18.0" - configstore "^4.0.0" - google-auth-library "^2.0.0" - pumpify "^1.5.1" - request "^2.87.0" - stream-events "^1.0.4" - gcs-resumable-upload@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/gcs-resumable-upload/-/gcs-resumable-upload-1.1.0.tgz#2b06f5876dcf60f18a309343f79ed951aff01399" @@ -15692,12 +13668,7 @@ genfun@^5.0.0: resolved "https://registry.yarnpkg.com/genfun/-/genfun-5.0.0.tgz#9dd9710a06900a5c4a5bf57aca5da4e52fe76537" integrity sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA== -get-caller-file@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" - integrity sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U= - -get-caller-file@^1.0.2: +get-caller-file@^1.0.1, get-caller-file@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== @@ -16124,7 +14095,7 @@ glob@7.1.1: once "^1.3.0" path-is-absolute "^1.0.0" -glob@7.1.2, glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@~7.1.1: +glob@7.1.2: version "7.1.2" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" integrity sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ== @@ -16136,7 +14107,7 @@ glob@7.1.2, glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@~7.1.1: once "^1.3.0" path-is-absolute "^1.0.0" -glob@7.1.3, glob@^7.0.5, glob@^7.0.6, glob@^7.1.3: +glob@7.1.3: version "7.1.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== @@ -16170,7 +14141,7 @@ glob@^6.0.1, glob@^6.0.4: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.1.4, glob@~7.1.2, glob@~7.1.4: +glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.0.6, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@~7.1.1, glob@~7.1.2, glob@~7.1.4: version "7.1.4" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== @@ -16263,12 +14234,7 @@ global@^4.3.0, global@~4.3.0: min-document "^2.19.0" process "~0.5.1" -globals@^11.1.0: - version "11.5.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.5.0.tgz#6bc840de6771173b191f13d3a9c94d441ee92642" - integrity sha512-hYyf+kI8dm3nORsiiXUQigOU62hDLfJ9G01uyGMxhc6BKsircrUhC4uJPQPUSuq2GrTmiiEt7ewxlMdBewfmKQ== - -globals@^11.7.0: +globals@^11.1.0, globals@^11.7.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== @@ -16361,19 +14327,6 @@ google-auth-library@^0.10.0: lodash.noop "^3.0.1" request "^2.74.0" -google-auth-library@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/google-auth-library/-/google-auth-library-2.0.2.tgz#7a315d2036744af6afcad87b210ee6638b40f57b" - integrity sha512-FURxmo1hBVmcfLauuMRKOPYAPKht3dGuI2wjeJFalDUThO0HoYVjr4yxt5cgYSFm1dgUpmN9G/poa7ceTFAIiA== - dependencies: - axios "^0.18.0" - gcp-metadata "^0.7.0" - gtoken "^2.3.0" - https-proxy-agent "^2.2.1" - jws "^3.1.5" - lru-cache "^5.0.0" - semver "^5.5.0" - google-auth-library@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/google-auth-library/-/google-auth-library-3.1.0.tgz#6378ea3e56067312209eee58223e5a00adaec639" @@ -16566,26 +14519,16 @@ got@^8.3.2: url-parse-lax "^3.0.0" url-to-options "^1.0.1" -graceful-fs@^4.0.0: +graceful-fs@^4.0.0, graceful-fs@^4.1.10, graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.4, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0: version "4.2.2" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.2.tgz#6f0952605d0140c1cfdb138ed005775b92d67b02" integrity sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q== -graceful-fs@^4.1.10, graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.4, graceful-fs@^4.1.6, graceful-fs@^4.1.9: - version "4.1.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" - integrity sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg= - -graceful-fs@^4.1.15, graceful-fs@~4.1.11, graceful-fs@~4.1.6: +graceful-fs@~4.1.11, graceful-fs@~4.1.6: 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== -graceful-fs@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.0.tgz#8d8fdc73977cb04104721cb53666c1ca64cd328b" - integrity sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg== - "graceful-readlink@>= 1.0.0": version "1.0.1" resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" @@ -16702,16 +14645,11 @@ graphql-tag-pluck@0.5.0: source-map-support "^0.5.9" typescript "^3.2.2" -graphql-tag@2.10.1: +graphql-tag@2.10.1, graphql-tag@^2.4.2, graphql-tag@^2.9.2: version "2.10.1" resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.10.1.tgz#10aa41f1cd8fae5373eaf11f1f67260a3cad5e02" integrity sha512-jApXqWBzNXQ8jYa/HLkZJaVw9jgwNqZkywa2zfFn16Iv1Zb7ELNHkJaXHR7Quvd5SIGsy6Ny7SUKATgnu05uEg== -graphql-tag@^2.4.2, 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== - graphql-toolkit@0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/graphql-toolkit/-/graphql-toolkit-0.0.5.tgz#9e6ebe3d4b33fc329e5ee3b7775bfe7fba2f48a5" @@ -16783,7 +14721,7 @@ grpc-gcp@^0.1.1: grpc "^1.16.0" protobufjs "^6.8.8" -grpc@1.24.1: +grpc@1.24.1, grpc@^1.16.0: version "1.24.1" resolved "https://registry.yarnpkg.com/grpc/-/grpc-1.24.1.tgz#0afefd6feeeb3d9ce09586f08400007ea6cb6a16" integrity sha512-NFIWbt3RXZU4VlDLpiAM/Ca8Yz30QShUdPGMqOPH652PmA+2fau2vuW+tOYWQUkYMfBW2yege/T5p65e5TetVQ== @@ -16795,17 +14733,6 @@ grpc@1.24.1: node-pre-gyp "^0.13.0" protobufjs "^5.0.3" -grpc@^1.16.0: - version "1.20.0" - resolved "https://registry.yarnpkg.com/grpc/-/grpc-1.20.0.tgz#85ad2aeb94bdbfe59c4a40b2fff8fc1ea70cd6a0" - integrity sha512-HgYuJzRomkBlJAfC/78epuWzwMiByxgj4JsO6G6dHXXNfARTsUqpM/FmPSJJNFGvzCev0g6tn33CE7nWEmhDEg== - dependencies: - lodash.camelcase "^4.3.0" - lodash.clone "^4.5.0" - nan "^2.0.0" - node-pre-gyp "^0.12.0" - protobufjs "^5.0.3" - gtoken@^1.2.1: version "1.2.3" resolved "https://registry.yarnpkg.com/gtoken/-/gtoken-1.2.3.tgz#5509571b8afd4322e124cf66cf68115284c476d8" @@ -16816,17 +14743,6 @@ gtoken@^1.2.1: mime "^1.4.1" request "^2.72.0" -gtoken@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/gtoken/-/gtoken-2.3.0.tgz#4e0ffc16432d7041a1b3dbc1d97aac17a5dc964a" - integrity sha512-Jc9/8mV630cZE9FC5tIlJCZNdUjwunvlwOtCz6IDlaiB4Sz68ki29a1+q97sWTnTYroiuF9B135rod9zrQdHLw== - dependencies: - axios "^0.18.0" - google-p12-pem "^1.0.0" - jws "^3.1.4" - mime "^2.2.0" - pify "^3.0.0" - gtoken@^2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/gtoken/-/gtoken-2.3.2.tgz#49890a866c1f44e173099be95515db5872a92151" @@ -16904,7 +14820,7 @@ hammerjs@^2.0.8: resolved "https://registry.yarnpkg.com/hammerjs/-/hammerjs-2.0.8.tgz#04ef77862cff2bb79d30f7692095930222bf60f1" integrity sha1-BO93hiz/K7edMPdpIJWTAiK/YPE= -handlebars@4.0.11, handlebars@^4.0.3: +handlebars@4.0.11: version "4.0.11" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.11.tgz#630a35dfe0294bc281edae6ffc5d329fc7982dcc" integrity sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw= @@ -16915,29 +14831,7 @@ handlebars@4.0.11, handlebars@^4.0.3: optionalDependencies: uglify-js "^2.6" -handlebars@^4.0.1: - version "4.2.0" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.2.0.tgz#57ce8d2175b9bbb3d8b3cf3e4217b1aec8ddcb2e" - integrity sha512-Kb4xn5Qh1cxAKvQnzNWZ512DhABzyFNmsaJf3OAkWNa4NkaqWcNI8Tao8Tasi0/F4JD9oyG0YxuFyvyR57d+Gw== - dependencies: - neo-async "^2.6.0" - optimist "^0.6.1" - source-map "^0.6.1" - optionalDependencies: - uglify-js "^3.1.4" - -handlebars@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.1.0.tgz#0d6a6f34ff1f63cecec8423aa4169827bf787c3a" - integrity sha512-l2jRuU1NAWK6AW5qqcTATWQJvNPEwkM7NEKSiv/gqOsoSQbVoWyqVEY5GS+XPQ88zLNmqASRpzfdm8d79hJS+w== - dependencies: - async "^2.5.0" - optimist "^0.6.1" - source-map "^0.6.1" - optionalDependencies: - uglify-js "^3.1.4" - -handlebars@^4.1.2: +handlebars@^4.0.1, handlebars@^4.0.3, handlebars@^4.1.0, handlebars@^4.1.2: version "4.4.3" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.4.3.tgz#180bae52c1d0e9ec0c15d7e82a4362d662762f6e" integrity sha512-B0W4A2U1ww3q7VVthTKfh+epHx+q4mCt6iK+zEAzbMBpWQAwxCeKxEGpj/1oQTpzPXDNSOG7hmG14TsISH50yw== @@ -16976,14 +14870,6 @@ har-validator@~4.2.1: ajv "^4.9.1" har-schema "^1.0.5" -har-validator@~5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" - integrity sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0= - dependencies: - ajv "^5.1.0" - har-schema "^2.0.0" - har-validator@~5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.0.tgz#44657f5688a22cfd4b72486e81b3a3fb11742c29" @@ -17077,14 +14963,7 @@ has-yarn@^1.0.0: resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-1.0.0.tgz#89e25db604b725c8f5976fff0addc921b828a5a7" integrity sha1-ieJdtgS3Jcj1l2//Ct3JIbgopac= -has@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28" - integrity sha1-hGFzP1OLCDfJNh45qauelwTcLyg= - dependencies: - function-bind "^1.0.2" - -has@^1.0.3, has@~1.0.3: +has@^1.0.1, has@^1.0.3, has@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== @@ -17124,16 +15003,6 @@ hawk@~3.1.3: hoek "2.x.x" sntp "1.x.x" -hawk@~6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/hawk/-/hawk-6.0.2.tgz#af4d914eb065f9b5ce4d9d11c1cb2126eecc3038" - integrity sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ== - dependencies: - boom "4.x.x" - cryptiles "3.x.x" - hoek "4.x.x" - sntp "2.x.x" - hdkey@^0.7.1: version "0.7.1" resolved "https://registry.yarnpkg.com/hdkey/-/hdkey-0.7.1.tgz#caee4be81aa77921e909b8d228dd0f29acaee632" @@ -17142,7 +15011,7 @@ hdkey@^0.7.1: coinstring "^2.0.0" secp256k1 "^3.0.1" -hdkey@^1.0.0, hdkey@^1.1.0: +hdkey@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/hdkey/-/hdkey-1.1.1.tgz#c2b3bfd5883ff9529b72f2f08b28be0972a9f64a" integrity sha512-DvHZ5OuavsfWs5yfVJZestsnc3wzPvLWNk6c2nRUfo6X+OtxypGt20vDDf7Ba+MJzjL3KS1og2nw2eBbLCOUTA== @@ -17249,11 +15118,6 @@ hoek@2.x.x: resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" integrity sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0= -hoek@4.x.x: - version "4.2.1" - resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.1.tgz#9634502aa12c445dd5a7c5734b572bb8738aacbb" - integrity sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA== - hoist-non-react-statics@3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.0.1.tgz#fba3e7df0210eb9447757ca1a7cb607162f0a364" @@ -17310,31 +15174,14 @@ home-path@^1.0.1: resolved "https://registry.yarnpkg.com/home-path/-/home-path-1.0.6.tgz#d549dc2465388a7f8667242c5b31588d29af29fc" integrity sha512-wo+yjrdAtoXt43Vy92a+0IPCYViiyLAHyp0QVS4xL/tfvVz5sXIW1ubLZk3nhVkD92fQpUMKX+fzMjr5F489vw== -homedir-polyfill@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz#4c2bbc8a758998feebf5ed68580f76d46768b4bc" - integrity sha1-TCu8inWJmP7r9e1oWA921GdotLw= - dependencies: - parse-passwd "^1.0.0" - -homedir-polyfill@^1.0.1: +homedir-polyfill@^1.0.0, homedir-polyfill@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== dependencies: parse-passwd "^1.0.0" -hosted-git-info@^2.1.4: - version "2.6.0" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.6.0.tgz#23235b29ab230c576aab0d4f13fc046b0b038222" - integrity sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw== - -hosted-git-info@^2.1.5, hosted-git-info@^2.4.2, hosted-git-info@^2.6.0: - version "2.7.1" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" - integrity sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w== - -hosted-git-info@^2.7.1: +hosted-git-info@^2.1.4, hosted-git-info@^2.1.5, hosted-git-info@^2.4.2, hosted-git-info@^2.6.0, hosted-git-info@^2.7.1: version "2.8.5" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.5.tgz#759cfcf2c4d156ade59b0b2dfabddc42a6b9c70c" integrity sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg== @@ -17455,16 +15302,6 @@ http-call@^5.1.2: parse-json "^4.0.0" tunnel-agent "^0.6.0" -http-errors@1.6.2: - version "1.6.2" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736" - integrity sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY= - dependencies: - depd "1.1.1" - inherits "2.0.3" - setprototypeof "1.0.3" - statuses ">= 1.3.1 < 2" - 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" @@ -17486,14 +15323,14 @@ http-errors@1.7.2: statuses ">= 1.5.0 < 2" toidentifier "1.0.0" -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== +http-errors@^1.7.1, http-errors@~1.7.2: + version "1.7.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" + integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== dependencies: depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.0" + inherits "2.0.4" + setprototypeof "1.1.1" statuses ">= 1.5.0 < 2" toidentifier "1.0.0" @@ -17505,17 +15342,6 @@ http-errors@~1.4.0: inherits "2.0.1" statuses ">= 1.2.1 < 2" -http-errors@~1.7.2: - version "1.7.3" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" - integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== - dependencies: - depd "~1.1.2" - inherits "2.0.4" - setprototypeof "1.1.1" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.0" - http-https@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/http-https/-/http-https-1.0.0.tgz#2f908dd5f1db4068c058cd6e6d4ce392c913389b" @@ -17569,7 +15395,7 @@ https-browserify@^1.0.0: resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= -https-proxy-agent@2.2.1, https-proxy-agent@^2.2.1: +https-proxy-agent@2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz#51552970fa04d723e04c56d04178c3f92592bbc0" integrity sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ== @@ -17577,7 +15403,7 @@ https-proxy-agent@2.2.1, https-proxy-agent@^2.2.1: agent-base "^4.1.0" debug "^3.1.0" -https-proxy-agent@^2.1.0: +https-proxy-agent@^2.1.0, https-proxy-agent@^2.2.1: version "2.2.2" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.2.tgz#271ea8e90f836ac9f119daccd39c19ff7dfb0793" integrity sha512-c8Ndjc9Bkpfx/vCJueCPy0jlP4ccCCSNDp8xwCZzPjKJUm+B+u9WX2x98Qx4n1PiMNTWo3D7KK5ifNV/yJyRzg== @@ -17706,20 +15532,13 @@ iconv-lite@0.4.23: dependencies: safer-buffer ">= 2.1.2 < 3" -iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@~0.4.13: +iconv-lite@0.4.24, iconv-lite@^0.4.17, iconv-lite@^0.4.24, iconv-lite@^0.4.4, iconv-lite@~0.4.13: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" -iconv-lite@^0.4.17, iconv-lite@^0.4.4: - version "0.4.21" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.21.tgz#c47f8733d02171189ebc4a400f3218d348094798" - integrity sha512-En5V9za5mBt2oUA03WGD3TwDv0MKAruqsuxstbMUZaj9W9k/m1CV/9py3l0L5kw9Bln8fdHQmzHSYtvpvTLpKw== - dependencies: - safer-buffer "^2.1.0" - iconv-lite@^0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.5.0.tgz#59cdde0a2a297cc2aeb0c6445a195ee89f127550" @@ -17783,16 +15602,11 @@ ignore-walk@^3.0.1: dependencies: minimatch "^3.0.4" -ignore@^3.3.5: +ignore@^3.3.5, ignore@^3.3.7: version "3.3.10" resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug== -ignore@^3.3.7: - version "3.3.8" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.8.tgz#3f8e9c35d38708a3a7e0e9abb6c73e7ee7707b2b" - integrity sha512-pUh+xUQQhQzevjRHHFqqcTy0/dP/kS9I8HSrUydhihjuD09W6ldVWFtIrwhXdUJHis3i2rZNqEHpZH/cbinFbg== - ignore@^4.0.3, ignore@^4.0.6: version "4.0.6" resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" @@ -17924,20 +15738,20 @@ inflight@^1.0.4, inflight@~1.0.4, inflight@~1.0.6: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3, inherits@~2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== inherits@2.0.1, inherits@=2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= -inherits@2.0.4, inherits@~2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= ini@^1.3.0, ini@^1.3.2, ini@^1.3.4, ini@^1.3.5, ini@~1.3.0, ini@~1.3.4: version "1.3.5" @@ -18019,7 +15833,7 @@ inquirer@^3.0.6: strip-ansi "^4.0.0" through "^2.3.6" -inquirer@^6.2.0: +inquirer@^6.2.0, inquirer@^6.2.2: version "6.5.0" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.0.tgz#2303317efc9a4ea7ec2e2df6f86569b734accf42" integrity sha512-scfHejeG/lVZSpvCXpsB4j/wQNPM5JC8kiElOI0OUTwmc1RTpXr4H32/HOlQHcZiYl2z2VElwuCVDRG8vFmbnA== @@ -18038,7 +15852,7 @@ inquirer@^6.2.0: strip-ansi "^5.1.0" through "^2.3.6" -inquirer@^6.2.2, inquirer@~6.3.1: +inquirer@~6.3.1: version "6.3.1" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.3.1.tgz#7a413b5e7950811013a3db491c61d1f3b776e8e7" integrity sha512-MmL624rfkFt4TG9y/Jvmt8vdmOo836U7Y0Hxr2aFk3RelZEGX4Igk0KabWrcaaZaTv9uzglOqWh1Vly+FAWAXA== @@ -18057,16 +15871,11 @@ inquirer@^6.2.2, inquirer@~6.3.1: strip-ansi "^5.1.0" through "^2.3.6" -interpret@1.2.0, interpret@^1.1.0: +interpret@1.2.0, interpret@^1.0.0, interpret@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296" integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw== -interpret@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614" - integrity sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ= - into-stream@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/into-stream/-/into-stream-3.1.0.tgz#96fb0a936c12babd6ff1752a17d05616abd094c6" @@ -18112,16 +15921,6 @@ ip@^1.1.4, ip@^1.1.5: resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= -ipaddr.js@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.6.0.tgz#e3fa357b773da619f26e95f049d055c72796f86b" - integrity sha1-4/o1e3c9phnybpXwSdBVxyeW+Gs= - -ipaddr.js@1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.0.tgz#eaa33d6ddd7ace8f7f6fe0c9ca0440e706738b1e" - integrity sha1-6qM9bd16zo9/b+DJygRA5wZzix4= - ipaddr.js@1.9.0: version "1.9.0" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.0.tgz#37df74e430a0e47550fe54a2defe30d8acd95f65" @@ -18213,11 +16012,6 @@ is-builtin-module@^1.0.0: dependencies: builtin-modules "^1.0.0" -is-callable@^1.1.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2" - integrity sha1-hut1OSgF3cM69xySoO7fdO52BLI= - is-callable@^1.1.3, is-callable@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" @@ -18354,7 +16148,7 @@ is-fullwidth-code-point@^3.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== -is-function@^1.0.1, is-function@~1.0.0: +is-function@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.1.tgz#12cfb98b65b57dd3d193a3121f5f6e2f437602b5" integrity sha1-Es+5i2W1fdPRk6MSH19uL0N2ArU= @@ -18369,7 +16163,7 @@ is-generator-fn@^2.0.0: resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.0.0.tgz#038c31b774709641bda678b1f06a4e3227c10b3e" integrity sha512-elzyIdM7iKoFHzcrndIqjYomImhxrFRnGP3galODoII4TB9gI7mZ+FnlLQmmjf27SxHS2gKEeyhX5/+YRS6H9g== -is-glob@4.0.0, is-glob@^4.0.0: +is-glob@4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0" integrity sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A= @@ -18395,7 +16189,7 @@ is-glob@^3.1.0: dependencies: is-extglob "^2.1.0" -is-glob@^4.0.1: +is-glob@^4.0.0, is-glob@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== @@ -18651,11 +16445,6 @@ is-subset@^0.1.1: resolved "https://registry.yarnpkg.com/is-subset/-/is-subset-0.1.1.tgz#8a59117d932de1de00f245fcdd39ce43f1e939a6" integrity sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY= -is-symbol@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572" - integrity sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI= - is-symbol@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38" @@ -19080,11 +16869,6 @@ jest-fetch-mock@^2.1.2: cross-fetch "^2.2.2" promise-polyfill "^7.1.1" -jest-get-type@^24.0.0: - version "24.0.0" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-24.0.0.tgz#36e72930b78e33da59a4f63d44d332188278940b" - integrity sha512-z6/Eyf6s9ZDGz7eOvl+fzpuJmN9i0KyTt1no37/dHu8galssxz5ZEgnc1KaV8R31q1khxyhB4ui/X5ZjjPk77w== - jest-get-type@^24.9.0: version "24.9.0" resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-24.9.0.tgz#1684a0c8a50f2e4901b6644ae861f579eed2ef0e" @@ -19185,12 +16969,7 @@ jest-pnp-resolver@^1.2.1: resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz#ecdae604c077a7fbc70defb6d517c3c1c898923a" integrity sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ== -jest-regex-util@^24.3.0: - version "24.3.0" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-24.3.0.tgz#d5a65f60be1ae3e310d5214a0307581995227b36" - integrity sha512-tXQR1NEOyGlfylyEjg1ImtScwMq8Oh3iJbGTjN7p0J23EuVX1MA8rwU69K4sLbCmwzgCUbVkm0FkSF9TdzOhtg== - -jest-regex-util@^24.9.0: +jest-regex-util@^24.3.0, jest-regex-util@^24.9.0: version "24.9.0" resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-24.9.0.tgz#c13fb3380bde22bf6575432c493ea8fe37965636" integrity sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA== @@ -19269,12 +17048,7 @@ jest-runtime@^24.9.0: strip-bom "^3.0.0" yargs "^13.3.0" -jest-serializer@^24.4.0: - version "24.4.0" - resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-24.4.0.tgz#f70c5918c8ea9235ccb1276d232e459080588db3" - integrity sha512-k//0DtglVstc1fv+GY/VHDIjrtNjdYvYjMlbLUed4kxrE92sIUewOi5Hj3vrpB8CXfkJntRPDRjCrCvUhBdL8Q== - -jest-serializer@^24.9.0: +jest-serializer@^24.4.0, jest-serializer@^24.9.0: version "24.9.0" resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-24.9.0.tgz#e6d7d7ef96d31e8b9079a714754c5d5c58288e73" integrity sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ== @@ -19316,18 +17090,7 @@ jest-util@^24.9.0: slash "^2.0.0" source-map "^0.6.0" -jest-validate@^24.0.0: - version "24.0.0" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-24.0.0.tgz#aa8571a46983a6538328fef20406b4a496b6c020" - integrity sha512-vMrKrTOP4BBFIeOWsjpsDgVXATxCspC9S1gqvbJ3Tnn/b9ACsJmteYeVx9830UMV28Cob1RX55x96Qq3Tfad4g== - dependencies: - camelcase "^5.0.0" - chalk "^2.0.1" - jest-get-type "^24.0.0" - leven "^2.1.0" - pretty-format "^24.0.0" - -jest-validate@^24.7.0, jest-validate@^24.9.0: +jest-validate@^24.0.0, jest-validate@^24.7.0, jest-validate@^24.9.0: version "24.9.0" resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-24.9.0.tgz#0775c55360d173cd854e40180756d4ff52def8ab" integrity sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ== @@ -19352,15 +17115,7 @@ jest-watcher@^24.9.0: jest-util "^24.9.0" string-length "^2.0.0" -jest-worker@^24.6.0: - version "24.6.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-24.6.0.tgz#7f81ceae34b7cde0c9827a6980c35b7cdc0161b3" - integrity sha512-jDwgW5W9qGNvpI1tNnvajh0a5IE/PuGLFmHk6aR/BZFz8tSgGw17GsDPXAJ6p91IvYDjOw8GpFbvvZGAK+DPQQ== - dependencies: - merge-stream "^1.0.1" - supports-color "^6.1.0" - -jest-worker@^24.9.0: +jest-worker@^24.6.0, jest-worker@^24.9.0: version "24.9.0" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-24.9.0.tgz#5dbfdb5b2d322e98567898238a9697bcce67b3e5" integrity sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw== @@ -19400,18 +17155,7 @@ js-base64@^2.1.8, js-base64@^2.1.9: resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.4.3.tgz#2e545ec2b0f2957f41356510205214e98fad6582" integrity sha512-H7ErYLM34CvDMto3GbD6xD0JLUGYXR3QTcH6B/tr4Hi/QpSThnCsIp+Sy5FRTw3B0d6py4HcNkW7nO/wdtGWEw== -js-beautify@^1.7.4: - version "1.10.0" - resolved "https://registry.yarnpkg.com/js-beautify/-/js-beautify-1.10.0.tgz#9753a13c858d96828658cd18ae3ca0e5783ea672" - integrity sha512-OMwf/tPDpE/BLlYKqZOhqWsd3/z2N3KOlyn1wsCRGFwViE8LOQTcDtathQvHvZc+q+zWmcNAbwKSC+iJoMaH2Q== - dependencies: - config-chain "^1.1.12" - editorconfig "^0.15.3" - glob "^7.1.3" - mkdirp "~0.5.1" - nopt "~4.0.1" - -js-beautify@^1.8.8: +js-beautify@^1.7.4, js-beautify@^1.8.8: version "1.10.2" resolved "https://registry.yarnpkg.com/js-beautify/-/js-beautify-1.10.2.tgz#88c9099cd6559402b124cfab18754936f8a7b178" integrity sha512-ZtBYyNUYJIsBWERnQP0rPN9KjkrDfJcMjuVGcvXOUJrD1zmOGwhRwQ4msG+HJ+Ni/FA7+sRQEMYVzdTQDvnzvQ== @@ -19447,11 +17191,6 @@ js-sha3@0.8.0: resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== -js-sha3@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.3.1.tgz#86122802142f0828502a0d1dee1d95e253bb0243" - integrity sha1-hhIoAhQvCChQKg0d7h2V4lO7AkM= - js-sha3@^0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.6.1.tgz#5b89f77a7477679877f58c4a075240934b1f95c0" @@ -19477,7 +17216,7 @@ js-tokens@^3.0.2: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= -js-yaml@3.12.0, js-yaml@^3.10.0, js-yaml@^3.9.0: +js-yaml@3.12.0: version "3.12.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1" integrity sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A== @@ -19493,7 +17232,7 @@ js-yaml@3.12.1: argparse "^1.0.7" esprima "^4.0.0" -js-yaml@3.13.1, js-yaml@3.x, js-yaml@^3.12.0, js-yaml@^3.13.0, js-yaml@^3.13.1: +js-yaml@3.13.1, js-yaml@3.x, js-yaml@^3.10.0, js-yaml@^3.12.0, js-yaml@^3.13.0, js-yaml@^3.13.1, js-yaml@^3.9.0: version "3.13.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== @@ -19759,38 +17498,7 @@ jsonwebtoken@8.1.0: ms "^2.0.0" xtend "^4.0.1" -jsonwebtoken@^8.1.0: - version "8.3.0" - resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-8.3.0.tgz#056c90eee9a65ed6e6c72ddb0a1d325109aaf643" - integrity sha512-oge/hvlmeJCH+iIz1DwcO7vKPkNGJHhgkspk8OH3VKlw+mbi42WtD4ig1+VXRln765vxptAv+xT26Fd3cteqag== - dependencies: - jws "^3.1.5" - lodash.includes "^4.3.0" - lodash.isboolean "^3.0.3" - lodash.isinteger "^4.0.4" - lodash.isnumber "^3.0.3" - lodash.isplainobject "^4.0.6" - lodash.isstring "^4.0.1" - lodash.once "^4.0.0" - ms "^2.1.1" - -jsonwebtoken@^8.2.1: - version "8.2.1" - resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-8.2.1.tgz#333ee39aa8f238f32fa41693e7a2fb7e42f82b31" - integrity sha512-l8rUBr0fqYYwPc8/ZGrue7GiW7vWdZtZqelxo4Sd5lMvuEeCK8/wS54sEo6tJhdZ6hqfutsj6COgC0d1XdbHGw== - dependencies: - jws "^3.1.4" - lodash.includes "^4.3.0" - lodash.isboolean "^3.0.3" - lodash.isinteger "^4.0.4" - lodash.isnumber "^3.0.3" - lodash.isplainobject "^4.0.6" - lodash.isstring "^4.0.1" - lodash.once "^4.0.0" - ms "^2.1.1" - xtend "^4.0.1" - -jsonwebtoken@^8.4.0, jsonwebtoken@^8.5.1: +jsonwebtoken@^8.1.0, jsonwebtoken@^8.2.1, jsonwebtoken@^8.4.0, jsonwebtoken@^8.5.1: version "8.5.1" resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz#00e71e0b8df54c2121a1f26137df2280673bcc0d" integrity sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w== @@ -19854,25 +17562,6 @@ just-extend@^3.0.0: resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-3.0.0.tgz#cee004031eaabf6406da03a7b84e4fe9d78ef288" integrity sha512-Fu3T6pKBuxjWT/p4DkqGHFRsysc8OauWr4ZRTY9dIx07Y9O0RkoR5jcv28aeD1vuAwhm3nLkDurwLXoALp4DpQ== -jwa@^1.1.4: - version "1.1.5" - resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.1.5.tgz#a0552ce0220742cd52e153774a32905c30e756e5" - integrity sha1-oFUs4CIHQs1S4VN3SjKQXDDnVuU= - dependencies: - base64url "2.0.0" - buffer-equal-constant-time "1.0.1" - ecdsa-sig-formatter "1.0.9" - safe-buffer "^5.0.1" - -jwa@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.1.6.tgz#87240e76c9808dbde18783cf2264ef4929ee50e6" - integrity sha512-tBO/cf++BUsJkYql/kBbJroKOgHWEigTKBAjjBEmrMGYd1QMBC74Hr4Wo2zCZw6ZrVhlJPvoMrkcOnlWR/DJfw== - dependencies: - buffer-equal-constant-time "1.0.1" - ecdsa-sig-formatter "1.0.10" - safe-buffer "^5.0.1" - jwa@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.1.tgz#743c32985cb9e98655530d53641b66c8645b039a" @@ -19882,24 +17571,7 @@ jwa@^1.4.1: ecdsa-sig-formatter "1.0.11" safe-buffer "^5.0.1" -jws@^3.0.0, jws@^3.1.5: - version "3.1.5" - resolved "https://registry.yarnpkg.com/jws/-/jws-3.1.5.tgz#80d12d05b293d1e841e7cb8b4e69e561adcf834f" - integrity sha512-GsCSexFADNQUr8T5HPJvayTjvPIfoyJPtLQBwn5a4WZQchcrPMPMAWcC1AzJVRDKyD6ZPROPAxgv6rfHViO4uQ== - dependencies: - jwa "^1.1.5" - safe-buffer "^5.0.1" - -jws@^3.1.4: - version "3.1.4" - resolved "https://registry.yarnpkg.com/jws/-/jws-3.1.4.tgz#f9e8b9338e8a847277d6444b1464f61880e050a2" - integrity sha1-+ei5M46KhHJ31kRLFGT2GIDgUKI= - dependencies: - base64url "^2.0.0" - jwa "^1.1.4" - safe-buffer "^5.0.1" - -jws@^3.2.2: +jws@^3.0.0, jws@^3.1.4, jws@^3.1.5, jws@^3.2.2: version "3.2.2" resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304" integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA== @@ -19932,7 +17604,7 @@ keccak@^1.0.2, keccak@^1.4.0: nan "^2.2.1" safe-buffer "^5.1.0" -keccakjs@^0.2.0: +keccakjs@^0.2.0, keccakjs@^0.2.1: version "0.2.3" resolved "https://registry.yarnpkg.com/keccakjs/-/keccakjs-0.2.3.tgz#5e4e969ce39689a3861f445d7752ee3477f9fe72" integrity sha512-BjLkNDcfaZ6l8HBG9tH0tpmDv3sS2mA7FNQxFHpCdzP3Gb2MVruXBSuoM66SnVxKJpAr5dKGdkHD+bDokt8fTg== @@ -19940,14 +17612,6 @@ keccakjs@^0.2.0: browserify-sha3 "^0.0.4" sha3 "^1.2.2" -keccakjs@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/keccakjs/-/keccakjs-0.2.1.tgz#1d633af907ef305bbf9f2fa616d56c44561dfa4d" - integrity sha1-HWM6+QfvMFu/ny+mFtVsRFYd+k0= - dependencies: - browserify-sha3 "^0.0.1" - sha3 "^1.1.0" - keygrip@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/keygrip/-/keygrip-1.0.2.tgz#ad3297c557069dea8bcfe7a4fa491b75c5ddeb91" @@ -20277,11 +17941,6 @@ levelup@^1.2.1: semver "~5.4.1" xtend "~4.0.0" -leven@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580" - integrity sha1-wuep93IJTe6dNCAq6KzORoeHVYA= - leven@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" @@ -20449,17 +18108,12 @@ load-segment@^1.0.1: lazy-async "~1.0.1" load-script-global "~1.0.1" -loader-runner@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2" - integrity sha1-9IKuqC1UPgeSFwDVpG7yb9rGuKI= - -loader-runner@^2.4.0: +loader-runner@^2.3.0, loader-runner@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== -loader-utils@1.1.0, loader-utils@^1.0.1, loader-utils@^1.0.2, loader-utils@^1.1.0: +loader-utils@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd" integrity sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0= @@ -20468,7 +18122,7 @@ loader-utils@1.1.0, loader-utils@^1.0.1, loader-utils@^1.0.2, loader-utils@^1.1. emojis-list "^2.0.0" json5 "^0.5.0" -loader-utils@1.2.3, loader-utils@^1.2.3: +loader-utils@1.2.3, loader-utils@^1.0.1, loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== @@ -20901,15 +18555,7 @@ lodash.tail@^4.1.1: resolved "https://registry.yarnpkg.com/lodash.tail/-/lodash.tail-4.1.1.tgz#d2333a36d9e7717c8ad2f7cacafec7c32b444664" integrity sha1-0jM6NtnncXyK0vfKyv7HwytERmQ= -lodash.template@^4.0.2, lodash.template@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.4.0.tgz#e73a0385c8355591746e020b99679c690e68fba0" - integrity sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A= - dependencies: - lodash._reinterpolate "~3.0.0" - lodash.templatesettings "^4.0.0" - -lodash.template@^4.5.0: +lodash.template@^4.0.2, lodash.template@^4.4.0, lodash.template@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab" integrity sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A== @@ -20966,7 +18612,7 @@ lodash.without@~4.4.0: resolved "https://registry.yarnpkg.com/lodash.without/-/lodash.without-4.4.0.tgz#3cd4574a00b67bae373a94b748772640507b7aac" integrity sha1-PNRXSgC2e643OpS3SHcmQFB7eqw= -lodash@4.17.10, lodash@4.17.11, lodash@4.17.14, lodash@4.17.15, lodash@4.17.4, lodash@4.x.x, lodash@=4.17.11, lodash@=4.17.4, lodash@^2.4.1, lodash@^3.10.1, lodash@^4.0.0, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.16.4, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0, lodash@^4.5.0, lodash@^4.6.0, lodash@^4.6.1, lodash@^4.7.14, lodash@~4.17.4: +lodash@4.17.10, lodash@4.17.11, lodash@4.17.14, lodash@4.17.15, lodash@4.17.4, lodash@4.x.x, lodash@=4.17.11, lodash@=4.17.4, lodash@^2.4.1, lodash@^3.10.1, lodash@^4.0.0, lodash@^4.13.1, lodash@^4.15.0, lodash@^4.16.4, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0, lodash@^4.5.0, lodash@^4.6.0, lodash@^4.6.1, lodash@^4.7.14, lodash@~4.17.4: version "4.17.15" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== @@ -21123,26 +18769,10 @@ lru-cache@^3.2.0: dependencies: pseudomap "^1.0.1" -lru-cache@^4.0.0, lru-cache@^4.1.3, lru-cache@^4.1.5, lru-cache@~4.1.1: - version "4.1.5" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" - integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== - dependencies: - pseudomap "^1.0.2" - yallist "^2.1.2" - -lru-cache@^4.0.1: - version "4.1.3" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c" - integrity sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA== - dependencies: - pseudomap "^1.0.2" - yallist "^2.1.2" - -lru-cache@^4.1.1, lru-cache@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.2.tgz#45234b2e6e2f2b33da125624c4664929a0224c3f" - integrity sha512-wgeVXhrDwAWnIF/yZARsFnMBtdFXOg1b8RIrhilp+0iDYN4mdQcNZElDZ0e4B64BhaxeQ5zN7PMyvu7we1kPeQ== +lru-cache@^4.0.0, lru-cache@^4.0.1, lru-cache@^4.1.1, lru-cache@^4.1.2, lru-cache@^4.1.3, lru-cache@^4.1.5, lru-cache@~4.1.1: + version "4.1.5" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" + integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== dependencies: pseudomap "^1.0.2" yallist "^2.1.2" @@ -21557,20 +19187,6 @@ merge2@^1.2.3: resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.2.3.tgz#7ee99dbd69bb6481689253f018488a1b902b0ed5" integrity sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA== -merkle-patricia-tree@2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/merkle-patricia-tree/-/merkle-patricia-tree-2.3.1.tgz#7d4e7263a9c85c1679187cad4a6d71f48d524c71" - integrity sha512-Qp9Mpb3xazznXzzGQBqHbqCpT2AR9joUOHYYPiQjYCarrdCPCnLWXo4BFv77y4xN26KR224xoU1n/qYY7RYYgw== - dependencies: - async "^1.4.2" - ethereumjs-util "^5.0.0" - level-ws "0.0.0" - levelup "^1.2.1" - memdown "^1.0.0" - readable-stream "^2.0.0" - rlp "^2.0.0" - semaphore ">=1.0.1" - merkle-patricia-tree@2.3.2, merkle-patricia-tree@^2.1.2, merkle-patricia-tree@^2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/merkle-patricia-tree/-/merkle-patricia-tree-2.3.2.tgz#982ca1b5a0fde00eed2f6aeed1f9152860b8208a" @@ -21918,31 +19534,16 @@ miller-rabin@^4.0.0: bn.js "^4.0.0" brorand "^1.0.1" -mime-db@1.40.0: +mime-db@1.40.0, "mime-db@>= 1.38.0 < 2": version "1.40.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.40.0.tgz#a65057e998db090f732a68f6c276d387d4126c32" integrity sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA== -"mime-db@>= 1.33.0 < 2", mime-db@~1.33.0: - version "1.33.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" - integrity sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ== - -"mime-db@>= 1.38.0 < 2": - version "1.38.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.38.0.tgz#1a2aab16da9eb167b49c6e4df2d9c68d63d8e2ad" - integrity sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg== - mime-db@~1.23.0: version "1.23.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.23.0.tgz#a31b4070adaea27d732ea333740a64d0ec9a6659" integrity sha1-oxtAcK2uon1zLqMzdApk0OyaZlk= -mime-db@~1.36.0: - version "1.36.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.36.0.tgz#5020478db3c7fe93aad7bbcc4dcf869c43363397" - integrity sha512-L+xvyD9MkoYMXb1jAmzI/lWYAxAMCPvIBSWur0PZ5nOf5euahRLVqH//FKW9mWp2lkqUgYiXPgkzfMUFi4zVDw== - mime-types@2.1.11: version "2.1.11" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.11.tgz#c259c471bda808a85d6cd193b430a5fae4473b3c" @@ -21950,27 +19551,13 @@ mime-types@2.1.11: dependencies: mime-db "~1.23.0" -mime-types@^2.0.8, mime-types@^2.1.12, mime-types@^2.1.16, mime-types@~2.1.17, mime-types@~2.1.18: - version "2.1.18" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" - integrity sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ== - dependencies: - mime-db "~1.33.0" - -mime-types@^2.1.11, mime-types@~2.1.24, mime-types@~2.1.7: +mime-types@^2.0.8, mime-types@^2.1.11, mime-types@^2.1.12, mime-types@^2.1.16, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.7: version "2.1.24" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.24.tgz#b6f8d0b3e951efb77dedeca194cff6d16f676f81" integrity sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ== dependencies: mime-db "1.40.0" -mime-types@~2.1.19: - version "2.1.20" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.20.tgz#930cb719d571e903738520f8470911548ca2cc19" - integrity sha512-HrkrPaP9vGuWbLK1B1FfgAkbqNjIuy4eHlIYnFi7kamZyLLrGlo2mpcx0bBmNpKqBtYtAfGbodDddIgddSJC2A== - dependencies: - mime-db "~1.36.0" - mime@1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" @@ -21981,17 +19568,7 @@ mime@1.6.0, mime@^1.4.1: resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== -mime@^2.0.3, mime@^2.3.1: - version "2.4.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.0.tgz#e051fd881358585f3279df333fe694da0bcffdd6" - integrity sha512-ikBcWwyqXQSHKtciCcctu9YfPbFYZ4+gbHEmE0Q8jzcTYQg5dHCr3g2wwAZjPoJfQVXZq6KXAjpXOTf5/cjT7w== - -mime@^2.2.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.3.1.tgz#b1621c54d63b97c47d3cfe7f7215f7d64517c369" - integrity sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg== - -mime@^2.4.1: +mime@^2.0.3, mime@^2.2.0, mime@^2.3.1, mime@^2.4.1: version "2.4.4" resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.4.tgz#bd7b91135fc6b01cde3e9bae33d659b63d8857e5" integrity sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA== @@ -22006,12 +19583,7 @@ mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -mimic-response@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.0.tgz#df3d3652a73fded6b9b0b24146e6fd052353458e" - integrity sha1-3z02Uqc/3ta5sLJBRub9BSNTRY4= - -mimic-response@^1.0.1: +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== @@ -22072,15 +19644,7 @@ minimist@~0.0.1: resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= -minipass@^2.2.1: - version "2.2.4" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.2.4.tgz#03c824d84551ec38a8d1bb5bc350a5a30a354a40" - integrity sha512-hzXIWWet/BzWhYs2b+u7dRHlruXhwdgvlTMDKC6Cb1U7ps6Ac6yQlR39xsbjWJE377YTCtKwIXIpJ5oP+j5y8g== - dependencies: - safe-buffer "^5.1.1" - yallist "^3.0.0" - -minipass@^2.3.5: +minipass@^2.2.1, minipass@^2.3.5: version "2.3.5" resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848" integrity sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA== @@ -22220,24 +19784,7 @@ mocha@^4.1.0: mkdirp "0.5.1" supports-color "4.4.0" -mocha@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-5.1.1.tgz#b774c75609dac05eb48f4d9ba1d827b97fde8a7b" - integrity sha512-kKKs/H1KrMMQIEsWNxGmb4/BGsmj0dkeyotEvbrAuQ01FcWRLssUNXCEUZk6SZtyJBi6EE7SL0zDDtItw1rGhw== - dependencies: - browser-stdout "1.3.1" - commander "2.11.0" - debug "3.1.0" - diff "3.5.0" - escape-string-regexp "1.0.5" - glob "7.1.2" - growl "1.10.3" - he "1.1.1" - minimatch "3.0.4" - mkdirp "0.5.1" - supports-color "4.4.0" - -mocha@^5.2.0: +mocha@^5.1.1, mocha@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/mocha/-/mocha-5.2.0.tgz#6d8ae508f59167f940f2b5b3c4a612ae50c90ae6" integrity sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ== @@ -22306,40 +19853,23 @@ module-not-found-error@^1.0.0: resolved "https://registry.yarnpkg.com/module-not-found-error/-/module-not-found-error-1.0.1.tgz#cf8b4ff4f29640674d6cdd02b0e3bc523c2bbdc0" integrity sha1-z4tP9PKWQGdNbN0CsOO8UjwrvcA= -moment-timezone@^0.5.21: +moment-timezone@^0.5.21, moment-timezone@^0.5.23: version "0.5.26" resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.26.tgz#c0267ca09ae84631aa3dc33f65bedbe6e8e0d772" integrity sha512-sFP4cgEKTCymBBKgoxZjYzlSovC20Y6J7y3nanDc5RoBIXKlZhoYwBoZGe3flwU6A372AcRwScH8KiwV6zjy1g== dependencies: moment ">= 2.9.0" -moment-timezone@^0.5.23: - 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.19.3: version "2.19.3" resolved "https://registry.yarnpkg.com/moment/-/moment-2.19.3.tgz#bdb99d270d6d7fda78cc0fbace855e27fe7da69f" integrity sha1-vbmdJw1tf9p4zA+6zoVeJ/59pp8= -moment@2.24.0, moment@^2.10.6, moment@^2.24.0: +moment@2.24.0, "moment@>= 2.9.0", moment@^2.10.6, moment@^2.22.1, moment@^2.24.0: version "2.24.0" resolved "https://registry.yarnpkg.com/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b" integrity sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg== -"moment@>= 2.9.0": - version "2.22.2" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.22.2.tgz#3c257f9839fc0e93ff53149632239eb90783ff66" - integrity sha1-PCV/mDn8DpP/UxSWMiOeuQeD/2Y= - -moment@^2.22.1: - version "2.22.1" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.22.1.tgz#529a2e9bf973f259c9643d237fda84de3a26e8ad" - integrity sha512-shJkRTSebXvsVqk56I+lkb2latjBs8I+pc2TzWc545y2iFnSjm7Wg0QMh+ZWcdSLQyGEau5jI8ocnmkyTgr9YQ== - moo@^0.4.3: version "0.4.3" resolved "https://registry.yarnpkg.com/moo/-/moo-0.4.3.tgz#3f847a26f31cf625a956a87f2b10fbc013bfd10e" @@ -22470,12 +20000,7 @@ nan@2.13.2: resolved "https://registry.yarnpkg.com/nan/-/nan-2.13.2.tgz#f51dc7ae66ba7d5d55e1e6d4d8092e802c9aefe7" integrity sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw== -nan@^2.0.0, nan@^2.0.8, nan@^2.10.0, nan@^2.2.1, nan@^2.3.3, nan@^2.9.2: - version "2.10.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f" - integrity sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA== - -nan@^2.11.0, nan@^2.12.1, nan@^2.13.2, nan@^2.14.0: +nan@^2.0.8, nan@^2.10.0, nan@^2.11.0, nan@^2.12.1, nan@^2.13.2, nan@^2.14.0, nan@^2.2.1, nan@^2.3.3: version "2.14.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== @@ -22569,25 +20094,7 @@ nearley@^2.7.10: randexp "0.4.6" semver "^5.4.1" -needle@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.0.tgz#f14efc69cee1024b72c8b21c7bdf94a731dc12fa" - integrity sha512-eFagy6c+TYayorXw/qtAdSvaUpEbBsDwDyxYFgLZ0lTojfH7K+OdBqAF7TAFwDokJaGpubpSGG0wO3iC0XPi8w== - dependencies: - debug "^2.1.2" - iconv-lite "^0.4.4" - sax "^1.2.4" - -needle@^2.2.1: - version "2.2.4" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.4.tgz#51931bff82533b1928b7d1d69e01f1b00ffd2a4e" - integrity sha512-HyoqEb4wr/rsoaIDfTH2aVL9nWtQqba2/HvMv+++m8u0dz808MaagKILxtfeSN7QU7nvbQ79zk3vYOJp9zsNEA== - dependencies: - debug "^2.1.2" - iconv-lite "^0.4.4" - sax "^1.2.4" - -needle@^2.2.4: +needle@^2.2.1, needle@^2.2.4: version "2.4.0" resolved "https://registry.yarnpkg.com/needle/-/needle-2.4.0.tgz#6833e74975c444642590e15a750288c5f939b57c" integrity sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg== @@ -22596,22 +20103,12 @@ needle@^2.2.4: iconv-lite "^0.4.4" sax "^1.2.4" -negotiator@0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" - integrity sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk= - negotiator@0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== -neo-async@^2.5.0: - version "2.5.1" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.5.1.tgz#acb909e327b1e87ec9ef15f41b8a269512ad41ee" - integrity sha512-3KL3fvuRkZ7s4IFOMfztb7zJp3QaVWnBeGoJlgB38XnCRPj/0tLzzLG5IB8NYOHbJ8g8UGrgZv44GLDk6CxTxA== - -neo-async@^2.6.0, neo-async@^2.6.1: +neo-async@^2.5.0, neo-async@^2.6.0, neo-async@^2.6.1: version "2.6.1" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== @@ -22828,7 +20325,7 @@ node-fetch-npm@^2.0.2: json-parse-better-errors "^1.0.0" safe-buffer "^5.1.1" -node-fetch@2.3.0, node-fetch@^2.3.0: +node-fetch@2.3.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== @@ -22841,12 +20338,7 @@ node-fetch@^1.0.1, node-fetch@~1.7.1: encoding "^0.1.11" is-stream "^1.0.1" -node-fetch@^2.0.0-alpha.8, node-fetch@^2.1.2, node-fetch@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.2.0.tgz#4ee79bde909262f9775f731e3656d0db55ced5b5" - integrity sha512-OayFWziIxiHY8bCUyLX6sTpDH8Jsbp4FfYd1j1f7vZyfgkcOnAyM4oQR16f8a0s7Gl/viMGRey8eScYk4V4EZA== - -node-fetch@^2.5.0, node-fetch@^2.6.0: +node-fetch@^2.0.0-alpha.8, node-fetch@^2.1.2, node-fetch@^2.2.0, node-fetch@^2.3.0, node-fetch@^2.5.0, node-fetch@^2.6.0: version "2.6.0" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd" integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA== @@ -22897,36 +20389,7 @@ node-int64@^0.4.0: resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= -node-libs-browser@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.1.0.tgz#5f94263d404f6e44767d726901fff05478d600df" - integrity sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg== - dependencies: - assert "^1.1.1" - browserify-zlib "^0.2.0" - buffer "^4.3.0" - console-browserify "^1.1.0" - constants-browserify "^1.0.0" - crypto-browserify "^3.11.0" - domain-browser "^1.1.1" - events "^1.0.0" - https-browserify "^1.0.0" - os-browserify "^0.3.0" - path-browserify "0.0.0" - process "^0.11.10" - punycode "^1.2.4" - querystring-es3 "^0.2.0" - readable-stream "^2.3.3" - stream-browserify "^2.0.1" - stream-http "^2.7.2" - string_decoder "^1.0.0" - timers-browserify "^2.0.4" - tty-browserify "0.0.0" - url "^0.11.0" - util "^0.10.3" - vm-browserify "0.0.4" - -node-libs-browser@^2.2.1: +node-libs-browser@^2.0.0, node-libs-browser@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== @@ -22988,17 +20451,7 @@ node-modules-regexp@^1.0.0: resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= -node-notifier@^5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.2.1.tgz#fa313dd08f5517db0e2502e5758d664ac69f9dea" - integrity sha512-MIBs+AAd6dJ2SklbbE8RUDRlIVhU8MaNLh1A9SUZDUHPiZkWLFde6UNwG41yQHZEToHgJMXqyVZ9UcS/ReOVTg== - dependencies: - growly "^1.3.0" - semver "^5.4.1" - shellwords "^0.1.1" - which "^1.3.0" - -node-notifier@^5.4.2: +node-notifier@^5.2.1, node-notifier@^5.4.2: version "5.4.3" resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.4.3.tgz#cb72daf94c93904098e28b9c590fd866e464bd50" integrity sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q== @@ -23009,22 +20462,6 @@ node-notifier@^5.4.2: shellwords "^0.1.1" which "^1.3.0" -node-pre-gyp@^0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.0.tgz#6e4ef5bb5c5203c6552448828c852c40111aac46" - integrity sha512-G7kEonQLRbcA/mOoFoxvlMrw6Q6dPf92+t/l0DFSMuSlDoWaI9JWIyPwK0jyE1bph//CUEL65/Fz1m2vJbmjQQ== - dependencies: - detect-libc "^1.0.2" - mkdirp "^0.5.1" - needle "^2.2.0" - nopt "^4.0.1" - npm-packlist "^1.1.6" - npmlog "^4.0.2" - rc "^1.1.7" - rimraf "^2.6.1" - semver "^5.3.0" - tar "^4" - node-pre-gyp@^0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.11.0.tgz#db1f33215272f692cd38f03238e3e9b47c5dd054" @@ -23073,22 +20510,6 @@ node-pre-gyp@^0.13.0: semver "^5.3.0" tar "^4" -node-pre-gyp@^0.9.0: - version "0.9.1" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.9.1.tgz#f11c07516dd92f87199dbc7e1838eab7cd56c9e0" - integrity sha1-8RwHUW3ZL4cZnbx+GDjqt81WyeA= - dependencies: - detect-libc "^1.0.2" - mkdirp "^0.5.1" - needle "^2.2.0" - nopt "^4.0.1" - npm-packlist "^1.1.6" - npmlog "^4.0.2" - rc "^1.1.7" - rimraf "^2.6.1" - semver "^5.3.0" - tar "^4" - node-releases@^1.1.25: version "1.1.26" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.26.tgz#f30563edc5c7dc20cf524cc8652ffa7be0762937" @@ -23096,13 +20517,6 @@ node-releases@^1.1.25: dependencies: semver "^5.3.0" -node-releases@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.3.tgz#aad9ce0dcb98129c753f772c0aa01360fb90fbd2" - integrity sha512-6VrvH7z6jqqNFY200kdB6HdzkgM96Oaj9v3dqGfgp6mF+cHmU4wyQKZ2/WPDRVoR0Jz9KqbamaBN0ZhdUaysUQ== - dependencies: - semver "^5.3.0" - node-sass@^4.11.0: version "4.12.0" resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.12.0.tgz#0914f531932380114a30cc5fa4fa63233a25f017" @@ -23141,7 +20555,7 @@ nodemailer@^4.6.8: resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-4.6.8.tgz#f82fb407828bf2e76d92acc34b823d83e774f89c" integrity sha512-A3s7EM/426OBIZbLHXq2KkgvmKbn2Xga4m4G+ZUA4IaZvG8PcZXrFh+2E4VaS2o+emhuUVRnzKN2YmpkXQ9qwA== -nodemon@1.19.1: +nodemon@1.19.1, nodemon@^1.18.8: version "1.19.1" resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-1.19.1.tgz#576f0aad0f863aabf8c48517f6192ff987cd5071" integrity sha512-/DXLzd/GhiaDXXbGId5BzxP1GlsqtMGM9zTmkWrgXtSqjKmGSbLicM/oAy4FR0YWm14jCHRwnR31AHS2dYFHrg== @@ -23157,22 +20571,6 @@ nodemon@1.19.1: undefsafe "^2.0.2" update-notifier "^2.5.0" -nodemon@^1.18.8: - version "1.18.9" - resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-1.18.9.tgz#90b467efd3b3c81b9453380aeb2a2cba535d0ead" - integrity sha512-oj/eEVTEI47pzYAjGkpcNw0xYwTl4XSTUQv2NPQI6PpN3b75PhpuYk3Vb3U80xHCyM2Jm+1j68ULHXl4OR3Afw== - dependencies: - chokidar "^2.0.4" - debug "^3.1.0" - ignore-by-default "^1.0.1" - minimatch "^3.0.4" - pstree.remy "^1.1.6" - semver "^5.5.0" - supports-color "^5.2.0" - touch "^3.1.0" - undefsafe "^2.0.2" - update-notifier "^2.5.0" - nodent-compiler@^3.2.10: version "3.2.11" resolved "https://registry.yarnpkg.com/nodent-compiler/-/nodent-compiler-3.2.11.tgz#8f4bc703d7d8d0e563f5e09ea22efdce04dbaf9b" @@ -23256,7 +20654,7 @@ normalize-git-url@~3.0.2: resolved "https://registry.yarnpkg.com/normalize-git-url/-/normalize-git-url-3.0.2.tgz#8e5f14be0bdaedb73e07200310aa416c27350fc4" integrity sha1-jl8Uvgva7bc+ByADEKpBbCc1D8Q= -normalize-package-data@^2.0.0, normalize-package-data@^2.4.0, normalize-package-data@^2.5.0, "normalize-package-data@~1.0.1 || ^2.0.0": +normalize-package-data@^2.0.0, normalize-package-data@^2.3.0, normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.3.5, normalize-package-data@^2.4.0, normalize-package-data@^2.5.0, "normalize-package-data@~1.0.1 || ^2.0.0": version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== @@ -23266,16 +20664,6 @@ normalize-package-data@^2.0.0, normalize-package-data@^2.4.0, normalize-package- semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" -normalize-package-data@^2.3.0, normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.3.5: - version "2.4.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" - integrity sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw== - dependencies: - hosted-git-info "^2.1.4" - is-builtin-module "^1.0.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - normalize-package-data@~2.3.5: version "2.3.8" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.3.8.tgz#d819eda2a9dedbd1ffa563ea4071d936782295bb" @@ -23409,15 +20797,7 @@ npm-package-arg@~4.1.0: hosted-git-info "^2.1.4" semver "4 || 5" -npm-packlist@^1.1.6: - version "1.1.10" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.10.tgz#1039db9e985727e464df066f4cf0ab6ef85c398a" - integrity sha512-AQC0Dyhzn4EiYEfIUjCdMl0JJ61I2ER9ukf/sLxJUcZHfo+VyEfz2rMJgLZSS1v30OxPQe1cN0LZA1xbcaVfWA== - dependencies: - ignore-walk "^3.0.1" - npm-bundled "^1.0.1" - -npm-packlist@^1.4.4: +npm-packlist@^1.1.6, npm-packlist@^1.4.4: version "1.4.4" resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.4.tgz#866224233850ac534b63d1a6e76050092b5d2f44" integrity sha512-zTLo8UcVYtDU3gdeaFu2Xu0n0EvelfHDGuqtNIn5RO7yQj4H1TqNdBc/yZjxnWA0PVB8D3Woyp0i5B43JwQ6Vw== @@ -23794,7 +21174,7 @@ nyc@11.7.2: yargs "11.1.0" yargs-parser "^8.0.0" -oauth-sign@~0.8.1, oauth-sign@~0.8.2: +oauth-sign@~0.8.1: version "0.8.2" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" integrity sha1-Rqarfwrq2N6unsBWV4C31O/rnUM= @@ -23848,12 +21228,7 @@ object-keys@0.5.0: resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-0.5.0.tgz#09e211f3e00318afc4f592e36e7cdc10d9ad7293" integrity sha1-CeIR8+ADGK/E9ZLjbnzcENmtcpM= -object-keys@^1.0.11, object-keys@^1.0.8: - version "1.0.11" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d" - integrity sha1-xUYBd4rVYPEULODgG8yotW0TQm0= - -object-keys@^1.0.12: +object-keys@^1.0.11, object-keys@^1.0.12: version "1.1.0" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.0.tgz#11bd22348dd2e096a045ab06f6c85bcc340fa032" integrity sha512-6OO5X1+2tYkNyNEx6TsCxEqFfRWaqx6EtMiSbGrw8Ob8v9Ne+Hl8rBAgLBZn5wjEz3s/s6U1WXFUFOcxxAwUpg== @@ -23902,17 +21277,7 @@ object.defaults@^1.0.0, object.defaults@^1.1.0: for-own "^1.0.0" isobject "^3.0.0" -object.entries@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.0.4.tgz#1bf9a4dd2288f5b33f3a993d257661f05d161a5f" - integrity sha1-G/mk3SKI9bM/Opk9JXZh8F0WGl8= - dependencies: - define-properties "^1.1.2" - es-abstract "^1.6.1" - function-bind "^1.1.0" - has "^1.0.1" - -object.entries@^1.1.0: +object.entries@^1.0.4, object.entries@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.0.tgz#2024fc6d6ba246aee38bdb0ffd5cfbcf371b7519" integrity sha512-l+H6EQ8qzGRxbkHOd5I/aHRhHDKoQXQ8g0BYt4uSweQU1/J6dZUOyWh9a2Vky35YCKjzmgxOzta2hH6kf9HuXA== @@ -23979,17 +21344,7 @@ object.reduce@^1.0.0: for-own "^1.0.0" make-iterator "^1.0.0" -object.values@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.0.4.tgz#e524da09b4f66ff05df457546ec72ac99f13069a" - integrity sha1-5STaCbT2b/Bd9FdUbscqyZ8TBpo= - dependencies: - define-properties "^1.1.2" - es-abstract "^1.6.1" - function-bind "^1.1.0" - has "^1.0.1" - -object.values@^1.1.0: +object.values@^1.0.4, object.values@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.0.tgz#bf6810ef5da3e5325790eaaa2be213ea84624da9" integrity sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg== @@ -24042,12 +21397,7 @@ on-finished@^2.2.0, on-finished@^2.3.0, on-finished@~2.3.0: dependencies: ee-first "1.1.1" -on-headers@^1.0.0, on-headers@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7" - integrity sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c= - -on-headers@~1.0.2: +on-headers@^1.0.0, on-headers@~1.0.1, on-headers@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== @@ -24078,26 +21428,14 @@ onetime@^5.1.0: dependencies: mimic-fn "^2.1.0" -open@^6.2.0: +open@^6.2.0, open@^6.3.0: version "6.4.0" resolved "https://registry.yarnpkg.com/open/-/open-6.4.0.tgz#5c13e96d0dc894686164f18965ecfe889ecfc8a9" integrity sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg== dependencies: is-wsl "^1.1.0" -open@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/open/-/open-6.3.0.tgz#60d0b845ee38fae0631f5d739a21bd40e3d2a527" - integrity sha512-6AHdrJxPvAXIowO/aIaeHZ8CeMdDf7qCyRNq8NwJpinmCdXhz+NZR7ie1Too94lpciCDsG+qHGO9Mt0svA4OqA== - dependencies: - is-wsl "^1.1.0" - -opencollective-postinstall@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/opencollective-postinstall/-/opencollective-postinstall-2.0.0.tgz#5fe062f2706bb84150f7fb1af9f1277e46ec1388" - integrity sha512-XAe80GycLe2yRGnJsUtt+EO5lk06XYRQt4kJJe53O2kJHPZJOZ+XMF/b47HW96e6LhfKVpwnXVr/s56jhV98jg== - -opencollective-postinstall@^2.0.2: +opencollective-postinstall@^2.0.0, opencollective-postinstall@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/opencollective-postinstall/-/opencollective-postinstall-2.0.2.tgz#5657f1bede69b6e33a45939b061eb53d3c6c3a89" integrity sha512-pVOEP16TrAO2/fjej1IdOyupJY8KDUM1CvsaScRbw6oddvpQoOfGk4ywha0HKKVAD6RkW4x6Q+tNBwhf3Bgpuw== @@ -24211,16 +21549,7 @@ os-locale@^2.0.0: lcid "^1.0.0" mem "^1.1.0" -os-locale@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.0.1.tgz#3b014fbf01d87f60a1e5348d80fe870dc82c4620" - integrity sha512-7g5e7dmXPtzcP4bgsZ8ixDVqA7oWYuEz4lOSujeWyliPai4gfVDiFIcwBg3aGCPnmSGfzOKTK3ccPn0CKv3DBw== - dependencies: - execa "^0.10.0" - lcid "^2.0.0" - mem "^4.0.0" - -os-locale@^3.1.0: +os-locale@^3.0.0, os-locale@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q== @@ -24294,14 +21623,7 @@ p-limit@^1.1.0: dependencies: p-try "^1.0.0" -p-limit@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.0.0.tgz#e624ed54ee8c460a778b3c9f3670496ff8a57aec" - integrity sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A== - dependencies: - p-try "^2.0.0" - -p-limit@^2.2.0: +p-limit@^2.0.0, p-limit@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.0.tgz#417c9941e6027a9abcba5092dd2904e255b5fbc2" integrity sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ== @@ -24341,12 +21663,7 @@ p-map@^1.1.1: resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b" integrity sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA== -p-map@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.0.0.tgz#be18c5a5adeb8e156460651421aceca56c213a50" - integrity sha512-GO107XdrSUmtHxVoi60qc9tUl/KkNKm+X2CF4P9amalpGxv5YqVPJNfSb0wcA+syCopkZvYYIzW8OVTQW59x/w== - -p-map@^2.1.0: +p-map@^2.0.0, p-map@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== @@ -24496,16 +21813,11 @@ pacote@~2.7.38: unique-filename "^1.1.0" which "^1.2.12" -pako@~1.0.2: +pako@~1.0.2, pako@~1.0.5: version "1.0.10" resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.10.tgz#4328badb5086a426aa90f541977d4955da5c9732" integrity sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw== -pako@~1.0.5: - version "1.0.6" - resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258" - integrity sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg== - parallel-transform@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.1.0.tgz#d410f065b05da23081fcd10f28854c29bda33b06" @@ -24669,12 +21981,7 @@ parse5@^3.0.1: dependencies: "@types/node" "*" -parseurl@~1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" - integrity sha1-/CidTtiZMRlGDBViUyYs3I3mW/M= - -parseurl@~1.3.3: +parseurl@~1.3.2, parseurl@~1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== @@ -24781,12 +22088,7 @@ path-match@^1.2.4: http-errors "~1.4.0" path-to-regexp "^1.0.0" -path-parse@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" - integrity sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME= - -path-parse@^1.0.6: +path-parse@^1.0.5, path-parse@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== @@ -24877,18 +22179,7 @@ pbkdf2@3.0.8: dependencies: create-hmac "^1.1.2" -pbkdf2@^3.0.3: - version "3.0.16" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.16.tgz#7404208ec6b01b62d85bf83853a8064f8d9c2a5c" - integrity sha512-y4CXP3thSxqf7c0qmOF+9UeOTrifiVTIM+u7NWlq+PRsHbr7r7dpCmvzrZxa96JJUNi0Y5w9VqG5ZNeCVMoDcA== - dependencies: - create-hash "^1.1.2" - create-hmac "^1.1.4" - ripemd160 "^2.0.1" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - -pbkdf2@^3.0.9: +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== @@ -25021,14 +22312,7 @@ pinkie@^2.0.0: resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= -pirates@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.0.tgz#850b18781b4ac6ec58a43c9ed9ec5fe6796addbd" - integrity sha512-8t5BsXy1LUIjn3WWOlOuFDuKswhQb/tkak641lvBgmPOBUQHXveORtlMCp6OdPV1dtuTaEahKA8VNz6uLfKBtA== - dependencies: - node-modules-regexp "^1.0.0" - -pirates@^4.0.1: +pirates@^4.0.0, pirates@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" integrity sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA== @@ -25268,16 +22552,7 @@ postcss@^5.0.10: source-map "^0.5.6" supports-color "^3.2.3" -postcss@^6.0.1, postcss@^6.0.21: - version "6.0.21" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.21.tgz#8265662694eddf9e9a5960db6da33c39e4cd069d" - integrity sha512-y/bKfbQz2Nn/QBC08bwvYUxEFOVGfPIUOTsJ2CK5inzlXW9SdYR1x4pEsG9blRAF/PX+wRNdOah+gx/hv4q7dw== - dependencies: - chalk "^2.3.2" - source-map "^0.6.1" - supports-color "^5.3.0" - -postcss@^6.0.23: +postcss@^6.0.1, postcss@^6.0.21, postcss@^6.0.23: version "6.0.23" resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324" integrity sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag== @@ -25398,17 +22673,12 @@ prettier@1.16.3: resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.16.3.tgz#8c62168453badef702f34b45b6ee899574a6a65d" integrity sha512-kn/GU6SMRYPxUakNXhpP0EedT/KmaPzr0H5lIsDogrykbaxOpOfAFfk5XA7DZrJyMAv1wlMV3CPcZruGXVVUZw== -prettier@1.16.4, prettier@^1.14.2: +prettier@1.16.4: version "1.16.4" resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.16.4.tgz#73e37e73e018ad2db9c76742e2647e21790c9717" integrity sha512-ZzWuos7TI5CKUeQAtFd6Zhm2s6EpAD/ZLApIhsF9pRvRtM1RFo61dM/4MSRUA0SuLugA/zgrZD8m0BaY46Og7g== -prettier@^1.14.3: - version "1.17.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.17.1.tgz#ed64b4e93e370cb8a25b9ef7fef3e4fd1c0995db" - integrity sha512-TzGRNvuUSmPgwivDqkZ9tM/qTGW9hqDKWOE9YHiyQdixlKbv7kvEqsmDPrcHJTKwthU774TQwZXVtaQ/mMsvjg== - -prettier@^1.15.3: +prettier@^1.14.2, prettier@^1.14.3, prettier@^1.15.3: version "1.18.2" resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.18.2.tgz#6823e7c5900017b4bd3acf46fe9ac4b4d7bda9ea" integrity sha512-OeHeMc0JhFE9idD4ZdtNibzY0+TPHSpSSb9h8FqtP+YnoZZ1sl8Vc9b1sasjfymH3SonAF4QcA2+mzHPhMvIiw== @@ -25437,15 +22707,7 @@ pretty-format@^23.6.0: ansi-regex "^3.0.0" ansi-styles "^3.2.0" -pretty-format@^24.0.0: - version "24.0.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-24.0.0.tgz#cb6599fd73ac088e37ed682f61291e4678f48591" - integrity sha512-LszZaKG665djUcqg5ZQq+XzezHLKrxsA86ZABTozp+oNhkdqa+tG2dX4qa6ERl5c/sRDrAa3lHmwnvKoP+OG/g== - dependencies: - ansi-regex "^4.0.0" - ansi-styles "^3.2.0" - -pretty-format@^24.7.0, pretty-format@^24.9.0: +pretty-format@^24.0.0, pretty-format@^24.7.0, pretty-format@^24.9.0: version "24.9.0" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-24.9.0.tgz#12fac31b37019a4eea3c11aa9a959eb7628aa7c9" integrity sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA== @@ -25506,7 +22768,7 @@ private@^0.1.6, private@^0.1.8: resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== -process-nextick-args@^2.0.0: +process-nextick-args@^2.0.0, process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== @@ -25516,11 +22778,6 @@ process-nextick-args@~1.0.6: resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" integrity sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M= -process-nextick-args@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" - integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw== - process@^0.11.0, process@^0.11.1, process@^0.11.10, process@^0.11.9: version "0.11.10" resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" @@ -25539,12 +22796,12 @@ progress-stream@^1.1.0: speedometer "~0.1.2" through2 "~0.2.3" -progress@2.0.0, progress@^2.0.0: +progress@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" integrity sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8= -progress@2.0.3, progress@^2.0.3: +progress@2.0.3, progress@^2.0.0, progress@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== @@ -25650,7 +22907,7 @@ prop-types-exact@1.2.0, prop-types-exact@^1.2.0: object.assign "^4.1.0" reflect.ownkeys "^0.2.0" -prop-types@15.6.2, prop-types@^15.6.2: +prop-types@15.6.2: version "15.6.2" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.2.tgz#05d5ca77b4453e985d60fc7ff8c859094a497102" integrity sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ== @@ -25658,16 +22915,7 @@ prop-types@15.6.2, prop-types@^15.6.2: loose-envify "^1.3.1" object-assign "^4.1.1" -prop-types@^15, prop-types@^15.5.8, prop-types@^15.6.1: - version "15.6.1" - resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.1.tgz#36644453564255ddda391191fb3a125cbdf654ca" - integrity sha512-4ec7bY1Y66LymSUOH/zARVYObB23AT2h8cf6e/O6ZALB/N0sqZFEx7rq6EYPX2MkOdKORuooI/H5k9TlR4q7kQ== - dependencies: - fbjs "^0.8.16" - loose-envify "^1.3.1" - object-assign "^4.1.1" - -prop-types@^15.5.0, prop-types@^15.5.10, prop-types@^15.5.3, prop-types@^15.6.0, prop-types@^15.7.2: +prop-types@^15, prop-types@^15.5.0, prop-types@^15.5.10, prop-types@^15.5.3, prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2: version "15.7.2" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== @@ -25700,26 +22948,7 @@ protobufjs@^5.0.3: glob "^7.0.5" yargs "^3.10.0" -protobufjs@^6.8.0: - version "6.8.6" - resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.8.6.tgz#ce3cf4fff9625b62966c455fc4c15e4331a11ca2" - integrity sha512-eH2OTP9s55vojr3b7NBaF9i4WhWPkv/nq55nznWNp/FomKrLViprUcqnBjHph2tFQ+7KciGPTPsVWGz0SOhL0Q== - 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" "^3.0.32" - "@types/node" "^8.9.4" - long "^4.0.0" - -protobufjs@^6.8.1, protobufjs@^6.8.6, protobufjs@^6.8.8: +protobufjs@^6.8.0, protobufjs@^6.8.1, protobufjs@^6.8.6, protobufjs@^6.8.8: version "6.8.8" resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.8.8.tgz#c8b4f1282fd7a90e6f5b109ed11c84af82908e7c" integrity sha512-AAmHtD5pXgZfi7GMpllpO3q1Xw1OYldr+dMUlAnffGTAhqkg72WdmSY71uKBF/JuyiKs8psYbtKrhi0ASCD8qw== @@ -25757,23 +22986,7 @@ protoduck@^5.0.1: dependencies: genfun "^5.0.0" -proxy-addr@~2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.3.tgz#355f262505a621646b3130a728eb647e22055341" - integrity sha512-jQTChiCJteusULxjBp8+jftSQE5Obdl3k4cnmLA6WXtK6XFuWRnvVL7aCiBqaLPM8c4ph0S4tKna8XvmIwEnXQ== - dependencies: - forwarded "~0.1.2" - ipaddr.js "1.6.0" - -proxy-addr@~2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.4.tgz#ecfc733bf22ff8c6f407fa275327b9ab67e48b93" - integrity sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA== - dependencies: - forwarded "~0.1.2" - ipaddr.js "1.8.0" - -proxy-addr@~2.0.5: +proxy-addr@~2.0.4, proxy-addr@~2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.5.tgz#34cbd64a2d81f4b1fd21e76f9f06c8a45299ee34" integrity sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ== @@ -25919,16 +23132,7 @@ pump@^3.0.0: end-of-stream "^1.1.0" once "^1.3.1" -pumpify@^1.3.3: - version "1.4.0" - resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.4.0.tgz#80b7c5df7e24153d03f0e7ac8a05a5d068bd07fb" - integrity sha512-2kmNR9ry+Pf45opRVirpNuIFotsxUGLaYqxIwuR77AYrYRMuFCz9eryHBS52L360O+NcR383CL4QYlMKPq4zYA== - dependencies: - duplexify "^3.5.3" - inherits "^2.0.3" - pump "^2.0.0" - -pumpify@^1.3.5, pumpify@^1.5.1: +pumpify@^1.3.3, pumpify@^1.3.5, pumpify@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== @@ -26010,17 +23214,12 @@ qrcode@^1.2.0: pngjs "^3.3.0" yargs "^12.0.5" -qs@6.5.1, qs@^6.4.0, qs@~6.5.1: - version "6.5.1" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" - integrity sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A== - -qs@6.5.2, qs@^6.5.1, qs@~6.5.2: +qs@6.5.2, qs@~6.5.2: version "6.5.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== -qs@6.7.0, qs@^6.5.0: +qs@6.7.0, qs@^6.4.0, qs@^6.5.0, qs@^6.5.1: version "6.7.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== @@ -26115,14 +23314,7 @@ randomatic@^1.1.3: is-number "^3.0.0" kind-of "^4.0.0" -randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: - version "2.0.6" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.6.tgz#d302c522948588848a8d300c932b44c24231da80" - integrity sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A== - dependencies: - safe-buffer "^5.1.0" - -randombytes@^2.0.6, randombytes@^2.1.0: +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.0.6, randombytes@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== @@ -26142,22 +23334,12 @@ randomhex@0.1.5: resolved "https://registry.yarnpkg.com/randomhex/-/randomhex-0.1.5.tgz#baceef982329091400f2a2912c6cd02f1094f585" integrity sha1-us7vmCMpCRQA8qKRLGzQLxCU9YU= -range-parser@^1.0.3, range-parser@~1.2.0, range-parser@~1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" - integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== - -raw-body@2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.2.tgz#bcd60c77d3eb93cde0050295c3f379389bc88f89" - integrity sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k= - dependencies: - bytes "3.0.0" - http-errors "1.6.2" - iconv-lite "0.4.19" - unpipe "1.0.0" +range-parser@^1.0.3, range-parser@~1.2.0, range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== -raw-body@2.3.3, raw-body@^2.2.0: +raw-body@2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.3.tgz#1b324ece6b5706e153855bc1148c65bb7f6ea0c3" integrity sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw== @@ -26167,7 +23349,7 @@ raw-body@2.3.3, raw-body@^2.2.0: iconv-lite "0.4.23" unpipe "1.0.0" -raw-body@2.4.0: +raw-body@2.4.0, raw-body@^2.2.0: version "2.4.0" resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== @@ -26187,16 +23369,6 @@ rc@^1.0.1, rc@^1.1.2, rc@^1.1.6, rc@^1.2.7: minimist "^1.2.0" strip-json-comments "~2.0.1" -rc@^1.1.7: - version "1.2.6" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.6.tgz#eb18989c6d4f4f162c399f79ddd29f3835568092" - integrity sha1-6xiYnG1PTxYsOZ953dKfODVWgJI= - dependencies: - deep-extend "~0.4.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - react-addons-shallow-compare@15.6.2: version "15.6.2" resolved "https://registry.yarnpkg.com/react-addons-shallow-compare/-/react-addons-shallow-compare-15.6.2.tgz#198a00b91fc37623db64a28fd17b596ba362702f" @@ -26261,15 +23433,7 @@ react-deep-force-update@^1.0.0: resolved "https://registry.yarnpkg.com/react-deep-force-update/-/react-deep-force-update-1.1.1.tgz#bcd31478027b64b3339f108921ab520b4313dc2c" integrity sha1-vNMUeAJ7ZLMznxCJIatSC0MT3Cw= -react-devtools-core@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/react-devtools-core/-/react-devtools-core-3.6.0.tgz#77009517d72594fe6e2794f5ae160646d77fc467" - integrity sha512-picLP5RMESANerl2Ieo2rcMmVBqTG5QgIkSGcoJqvT5V4+HpLRjz5QW8xC85i+bXLdJmjoi3ZE9qDpNa5m7S4A== - dependencies: - shell-quote "^1.6.1" - ws "^3.3.1" - -react-devtools-core@^3.6.3: +react-devtools-core@^3.6.0, react-devtools-core@^3.6.3: version "3.6.3" resolved "https://registry.yarnpkg.com/react-devtools-core/-/react-devtools-core-3.6.3.tgz#977d95b684c6ad28205f0c62e1e12c5f16675814" integrity sha512-+P+eFy/yo8Z/UH9J0DqHZuUM5+RI2wl249TNvMx3J2jpUomLQa4Zxl56GEotGfw3PIP1eI+hVf1s53FlUONStQ== @@ -26346,21 +23510,11 @@ react-is@16.6.3: resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.6.3.tgz#d2d7462fcfcbe6ec0da56ad69047e47e56e7eac0" integrity sha512-u7FDWtthB4rWibG/+mFbVd5FvdI20yde86qKGx4lVUTWmPlSWQ4QxbBIrrs+HnXGbxOUlUzTAP/VDmvCwaP2yA== -react-is@^16.3.2: - version "16.3.2" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.3.2.tgz#f4d3d0e2f5fbb6ac46450641eb2e25bf05d36b22" - integrity sha512-ybEM7YOr4yBgFd6w8dJqwxegqZGJNBZl6U27HnGKuTZmDvVrD5quWOK/wAnMywiZzW+Qsk+l4X2c70+thp/A8Q== - -react-is@^16.7.0, react-is@^16.9.0: +react-is@^16.3.2, react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.4, react-is@^16.8.6, react-is@^16.9.0: version "16.9.0" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.9.0.tgz#21ca9561399aad0ff1a7701c01683e8ca981edcb" integrity sha512-tJBzzzIgnnRfEm046qRcURvwQnZVXmuCbscxUO5RWrGTXpon2d4c8mI0D8WE6ydVIm29JiLB6+RslkIvym9Rjw== -react-is@^16.8.1, react-is@^16.8.3, react-is@^16.8.4, react-is@^16.8.6: - version "16.8.6" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.8.6.tgz#5bbc1e2d29141c9fbdfed456343fe2bc430a6a16" - integrity sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA== - react-lazyload-fadein@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/react-lazyload-fadein/-/react-lazyload-fadein-1.1.0.tgz#f1a46f989d00cab2a9593cdbb083f2927c03621f" @@ -26715,16 +23869,11 @@ react-native-svg-mock@^2.0.0: resolved "https://registry.yarnpkg.com/react-native-svg-mock/-/react-native-svg-mock-2.0.0.tgz#27f4793e860ec6cae783930e6afb54869f0a2ea9" integrity sha512-+Op91zndXy+fUHZlcYo2YU3RzW5yXvKXE/mqMgYOdJLLS2kWwZBjAGt+CiKGl/+ZKnJ8/h0TWiiT0vCSv2NxEA== -react-native-svg@^9.11.1: +react-native-svg@^9.11.1, react-native-svg@^9.3.6: version "9.11.1" resolved "https://registry.yarnpkg.com/react-native-svg/-/react-native-svg-9.11.1.tgz#b1ccf48de413ff8c4f476f202aaa3893f4c8b59a" integrity sha512-BmNCM81SSzhj1+N5rYiy7sxrkmybgiT8Cu8yVRB7zVoWze/i1lbCWJah+Gk0OHHwR35ZA31oVKf5jtO4G1n94Q== -react-native-svg@^9.3.6: - version "9.3.6" - resolved "https://registry.yarnpkg.com/react-native-svg/-/react-native-svg-9.3.6.tgz#99361aa98aabad0d538f63e7096456cf54f48e2c" - integrity sha512-HEx8tSwzIN2kmY4prpUMQK2DY3aGkPXgKIiHfuvmGvuL+7d4wn4j7v1z/3TyLfwwSxlwGKG036TUQOot1BKGMA== - react-native-swiper@^1.5.14: version "1.5.14" resolved "https://registry.yarnpkg.com/react-native-swiper/-/react-native-swiper-1.5.14.tgz#1c6f949ca377186300f972bb0f30d24062c899aa" @@ -26915,7 +24064,7 @@ react-reveal@^1.2.2: dependencies: prop-types "^15.5.10" -react-test-renderer@16.9.0: +react-test-renderer@16.9.0, react-test-renderer@^16.0.0-0: version "16.9.0" resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.9.0.tgz#7ed657a374af47af88f66f33a3ef99c9610c8ae9" integrity sha512-R62stB73qZyhrJo7wmCW9jgl/07ai+YzvouvCXIJLBkRlRqLx4j9RqcLEAfNfU3OxTGucqR2Whmn3/Aad6L3hQ== @@ -26925,16 +24074,6 @@ react-test-renderer@16.9.0: react-is "^16.9.0" scheduler "^0.15.0" -react-test-renderer@^16.0.0-0: - version "16.8.3" - resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.8.3.tgz#230006af264cc46aeef94392e04747c21839e05e" - integrity sha512-rjJGYebduKNZH0k1bUivVrRLX04JfIQ0FKJLPK10TAb06XWhfi4gTobooF9K/DEFNW98iGac3OSxkfIJUN9Mdg== - dependencies: - object-assign "^4.1.1" - prop-types "^15.6.2" - react-is "^16.8.3" - scheduler "^0.13.3" - react-themeable@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/react-themeable/-/react-themeable-1.1.0.tgz#7d4466dd9b2b5fa75058727825e9f152ba379a0e" @@ -27128,7 +24267,7 @@ read@1, read@~1.0.1, read@~1.0.7: dependencies: mute-stream "~0.0.4" -"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.2.9, readable-stream@^2.3.0, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.2, readable-stream@~2.3.6: +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.2.9, readable-stream@^2.3.0, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.2, readable-stream@~2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== @@ -27161,25 +24300,7 @@ readable-stream@1.1.x, readable-stream@^1.0.33, readable-stream@~1.1.10, readabl isarray "0.0.1" string_decoder "~0.10.x" -"readable-stream@2 || 3": - version "3.1.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.1.0.tgz#19c2e9c1ce43507c53f6eefbcf1ee3d4aaa786f5" - integrity sha512-vpydAvIJvPODZNagCPuHG87O9JNPtvFEtjHHRVwNVsVVRBqemvPJkc2SYbxJsiZXawJdtZNmkmnsPuE3IgsG0A== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readable-stream@3, readable-stream@^3.0.2, readable-stream@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.1.1.tgz#ed6bbc6c5ba58b090039ff18ce670515795aeb06" - integrity sha512-DkN66hPyqDhnIQ6Jcsvx9bFjhw214O4poMBcIMgPVpQvNy9a0e0Uhg5SqySyDKAmUlwt8LonTBz1ezOnM8pUdA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readable-stream@^3.0.1, readable-stream@^3.4.0: +"readable-stream@2 || 3", readable-stream@3, readable-stream@^3.0.1, readable-stream@^3.0.2, readable-stream@^3.1.1, readable-stream@^3.4.0: version "3.4.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.4.0.tgz#a51c26754658e0a3c21dbf59163bd45ba6f447fc" integrity sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ== @@ -27223,17 +24344,7 @@ readdir-scoped-modules@^1.0.0: graceful-fs "^4.1.2" once "^1.3.0" -readdirp@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" - integrity sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg= - dependencies: - graceful-fs "^4.1.2" - minimatch "^3.0.2" - readable-stream "^2.0.2" - set-immediate-shim "^1.0.1" - -readdirp@^2.2.1: +readdirp@^2.0.0, readdirp@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== @@ -27367,13 +24478,6 @@ reflect.ownkeys@^0.2.0: resolved "https://registry.yarnpkg.com/reflect.ownkeys/-/reflect.ownkeys-0.2.0.tgz#749aceec7f3fdf8b63f927a04809e90c5c0b3460" integrity sha1-dJrO7H8/34tj+SegSAnpDFwLNGA= -regenerate-unicode-properties@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-7.0.0.tgz#107405afcc4a190ec5ed450ecaa00ed0cafa7a4c" - integrity sha512-s5NGghCE4itSlUS+0WUj88G6cfMVMmH8boTPNvABf8od+2dhT9WDlWu8n01raQAJZMOK8Ch6jSexaRO7swd6aw== - dependencies: - regenerate "^1.4.0" - regenerate-unicode-properties@^8.0.2: version "8.1.0" resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz#ef51e0f0ea4ad424b77bf7cb41f3e015c70a3f0e" @@ -27381,12 +24485,7 @@ regenerate-unicode-properties@^8.0.2: dependencies: regenerate "^1.4.0" -regenerate@^1.2.1: - version "1.3.3" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.3.tgz#0c336d3980553d755c39b586ae3b20aa49c82b7f" - integrity sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg== - -regenerate@^1.4.0: +regenerate@^1.2.1, regenerate@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== @@ -27415,13 +24514,6 @@ regenerator-transform@^0.10.0: babel-types "^6.19.0" private "^0.1.6" -regenerator-transform@^0.13.3: - version "0.13.3" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.13.3.tgz#264bd9ff38a8ce24b06e0636496b2c856b57bcbb" - integrity sha512-5ipTrZFSq5vU2YoGoww4uaRVAK4wyYC4TSICibbfEPOruUu8FFP7ErV0BjmbIOEpn3O/k9na9UEdYR/3m7N6uA== - dependencies: - private "^0.1.6" - regenerator-transform@^0.14.0: version "0.14.1" resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.1.tgz#3b2fce4e1ab7732c08f665dfdb314749c7ddd2fb" @@ -27472,30 +24564,6 @@ regexpu-core@^2.0.0: regjsgen "^0.2.0" regjsparser "^0.1.4" -regexpu-core@^4.1.3: - version "4.2.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.2.0.tgz#a3744fa03806cffe146dea4421a3e73bdcc47b1d" - integrity sha512-Z835VSnJJ46CNBttalHD/dB+Sj2ezmY6Xp38npwU87peK6mqOzOpV8eYktdkLTEkzzD+JsTcxd84ozd8I14+rw== - dependencies: - regenerate "^1.4.0" - regenerate-unicode-properties "^7.0.0" - regjsgen "^0.4.0" - regjsparser "^0.3.0" - unicode-match-property-ecmascript "^1.0.4" - unicode-match-property-value-ecmascript "^1.0.2" - -regexpu-core@^4.2.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.4.0.tgz#8d43e0d1266883969720345e70c275ee0aec0d32" - integrity sha512-eDDWElbwwI3K0Lo6CqbQbA6FwgtCz4kYTarrri1okfkRLZAqstU+B3voZBCjg8Fl6iq0gXrJG6MvRgLthfvgOA== - dependencies: - regenerate "^1.4.0" - regenerate-unicode-properties "^7.0.0" - regjsgen "^0.5.0" - regjsparser "^0.6.0" - unicode-match-property-ecmascript "^1.0.4" - unicode-match-property-value-ecmascript "^1.0.2" - regexpu-core@^4.5.4: version "4.5.4" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.5.4.tgz#080d9d02289aa87fe1667a4f5136bc98a6aebaae" @@ -27528,11 +24596,6 @@ regjsgen@^0.2.0: resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" integrity sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc= -regjsgen@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.4.0.tgz#c1eb4c89a209263f8717c782591523913ede2561" - integrity sha512-X51Lte1gCYUdlwhF28+2YMO0U6WeN0GLpgpA7LK7mbdDnkQYiwvEpmpe0F/cv5L14EbxgrdayAG3JETBv0dbXA== - regjsgen@^0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.0.tgz#a7634dc08f89209c2049adda3525711fb97265dd" @@ -27545,13 +24608,6 @@ regjsparser@^0.1.4: dependencies: jsesc "~0.5.0" -regjsparser@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.3.0.tgz#3c326da7fcfd69fa0d332575a41c8c0cdf588c96" - integrity sha512-zza72oZBBHzt64G7DxdqrOo/30bhHkwMUoT0WqfGu98XLd7N+1tsy5MJ96Bk4MD0y74n629RhmrGW6XlnLLwCA== - dependencies: - jsesc "~0.5.0" - regjsparser@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.0.tgz#f1e6ae8b7da2bae96c99399b868cd6c933a2ba9c" @@ -27748,7 +24804,7 @@ request-promise@^4.2.2: stealthy-require "^1.1.1" tough-cookie "^2.3.3" -request@2.88.0, request@^2.45.0, request@^2.67.0, request@^2.85.0, request@^2.87.0, request@^2.88.0: +request@2.88.0, request@2.x, request@^2.45.0, request@^2.67.0, request@^2.72.0, request@^2.74.0, request@^2.79.0, request@^2.81.0, request@^2.83.0, request@^2.85.0, request@^2.87.0, request@^2.88.0: version "2.88.0" resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== @@ -27774,60 +24830,6 @@ request@2.88.0, request@^2.45.0, request@^2.67.0, request@^2.85.0, request@^2.87 tunnel-agent "^0.6.0" uuid "^3.3.2" -request@2.x, request@^2.72.0, request@^2.74.0: - version "2.87.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.87.0.tgz#32f00235cd08d482b4d0d68db93a829c0ed5756e" - integrity sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw== - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.6.0" - caseless "~0.12.0" - combined-stream "~1.0.5" - extend "~3.0.1" - forever-agent "~0.6.1" - form-data "~2.3.1" - har-validator "~5.0.3" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.17" - oauth-sign "~0.8.2" - performance-now "^2.1.0" - qs "~6.5.1" - safe-buffer "^5.1.1" - tough-cookie "~2.3.3" - tunnel-agent "^0.6.0" - uuid "^3.1.0" - -request@^2.79.0, request@^2.81.0, request@^2.83.0: - version "2.85.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.85.0.tgz#5a03615a47c61420b3eb99b7dba204f83603e1fa" - integrity sha512-8H7Ehijd4js+s6wuVPLjwORxD4zeuyjYugprdOXlPSqaApmL/QOy+EB/beICHVCHkGMKNh5rvihb5ov+IDw4mg== - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.6.0" - caseless "~0.12.0" - combined-stream "~1.0.5" - extend "~3.0.1" - forever-agent "~0.6.1" - form-data "~2.3.1" - har-validator "~5.0.3" - hawk "~6.0.2" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.17" - oauth-sign "~0.8.2" - performance-now "^2.1.0" - qs "~6.5.1" - safe-buffer "^5.1.1" - stringstream "~0.0.5" - tough-cookie "~2.3.3" - tunnel-agent "^0.6.0" - uuid "^3.1.0" - request@~2.74.0: version "2.74.0" resolved "https://registry.yarnpkg.com/request/-/request-2.74.0.tgz#7693ca768bbb0ea5c8ce08c084a45efa05b892ab" @@ -27990,40 +24992,26 @@ resolve@1.5.0: dependencies: path-parse "^1.0.5" -resolve@1.x, resolve@^1.8.1, resolve@~1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" - integrity sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA== - dependencies: - path-parse "^1.0.5" - -resolve@^1.1.6, resolve@^1.3.2, resolve@^1.4.0, resolve@^1.5.0: - version "1.7.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.7.1.tgz#aadd656374fd298aee895bc026b8297418677fd3" - integrity sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw== - dependencies: - path-parse "^1.0.5" - -resolve@^1.1.7, resolve@^1.9.0: +resolve@1.x, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.3.2, resolve@^1.4.0, resolve@^1.5.0, resolve@^1.8.1, resolve@^1.9.0: version "1.12.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.12.0.tgz#3fc644a35c84a48554609ff26ec52b66fa577df6" integrity sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w== dependencies: path-parse "^1.0.6" -resolve@^1.10.0, resolve@~1.11.1: +resolve@~1.11.1: version "1.11.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.11.1.tgz#ea10d8110376982fef578df8fc30b9ac30a07a3e" integrity sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw== dependencies: path-parse "^1.0.6" -resolve@~1.10.1: - version "1.10.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.10.1.tgz#664842ac960795bbe758221cdccda61fb64b5f18" - integrity sha512-KuIe4mf++td/eFb6wkaPbMDnP6kObCaEtIDuHOUED6MNUo4K670KZUHuuvYPZDxNF0WVLw49n06M2m2dXphEzA== +resolve@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" + integrity sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA== dependencies: - path-parse "^1.0.6" + path-parse "^1.0.5" responselike@1.0.2, responselike@^1.0.2: version "1.0.2" @@ -28059,11 +25047,6 @@ retry-as-promised@^3.1.0: dependencies: any-promise "^1.3.0" -retry-axios@0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/retry-axios/-/retry-axios-0.3.2.tgz#5757c80f585b4cc4c4986aa2ffd47a60c6d35e13" - integrity sha512-jp4YlI0qyDFfXiXGhkCOliBN1G7fRH03Nqy8YdShzGqbY5/9S2x/IR6C88ls2DFkbWuL3ASkP7QD3pVrNpPgwQ== - retry-request@^3.0.0: version "3.3.1" resolved "https://registry.yarnpkg.com/retry-request/-/retry-request-3.3.1.tgz#fb71276235a617e97551e9be737ab5b91591fb9e" @@ -28096,14 +25079,7 @@ right-align@^0.1.1: dependencies: align-text "^0.1.1" -rimraf@2, rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" - integrity sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w== - dependencies: - glob "^7.0.5" - -rimraf@2.6.3, rimraf@^2.5.2, rimraf@^2.6.3, rimraf@~2.6.1: +rimraf@2, rimraf@2.6.3, rimraf@^2.2.8, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3, rimraf@~2.6.1: version "2.6.3" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== @@ -28142,14 +25118,7 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: hash-base "^3.0.0" inherits "^2.0.1" -rlp@2.1.0, rlp@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.1.0.tgz#e4f9886d5a982174f314543831e36e1a658460f9" - integrity sha512-93U7IKH5j7nmXFVg19MeNBGzQW5uXW1pmCuKY8veeKIhYTE32C2d0mOegfiIAfXcHOKJjjPlJisn8iHDF5AezA== - dependencies: - safe-buffer "^5.1.1" - -rlp@^2.2.1, rlp@^2.2.3: +rlp@^2.0.0, rlp@^2.2.1, rlp@^2.2.3: version "2.2.3" resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.3.tgz#7f94aef86cec412df87d5ea1d8cb116a47d45f0e" integrity sha512-l6YVrI7+d2vpW6D6rS05x2Xrmq8oW7v3pieZOJKBEdjuTF4Kz/iwk55Zyh1Zaz+KOB2kC8+2jZlp2u9L4tTzCQ== @@ -28236,14 +25205,7 @@ rxjs@^5.4.3: dependencies: symbol-observable "1.0.1" -rxjs@^6.3.3, rxjs@^6.4.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.4.0.tgz#f3bb0fe7bda7fb69deac0c16f17b50b0b8790504" - integrity sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw== - dependencies: - tslib "^1.9.0" - -rxjs@^6.5.2: +rxjs@^6.3.3, rxjs@^6.4.0, rxjs@^6.5.2: version "6.5.2" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.2.tgz#2e35ce815cd46d84d02a209fb4e5921e051dbec7" integrity sha512-HUb7j3kvb7p7eCUHE3FqjoDsC1xfZQ4AHFWfTKSpZ+sAhhz5X1WX0ZuUqWbzB2QhSLp3DoLUG+hMdEDKqWo2Zg== @@ -28255,12 +25217,12 @@ safe-buffer@5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" integrity sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg== -safe-buffer@5.1.2, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: +safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@^5.2.0: +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== @@ -28289,7 +25251,7 @@ safe-regex@^1.1.0: dependencies: ret "~0.1.10" -"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.1.0: +"safer-buffer@>= 2.1.2 < 3": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== @@ -28379,14 +25341,6 @@ scheduler@0.15.0, scheduler@^0.15.0: loose-envify "^1.1.0" object-assign "^4.1.1" -scheduler@^0.13.3: - version "0.13.6" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.13.6.tgz#466a4ec332467b31a91b9bf74e5347072e4cd889" - integrity sha512-IWnObHt413ucAYKsD9J1QShUKkbKLQQHdxRyw73sw4FN26iWr3DY/H34xGPe4nmL1DwXyWmSWmMrA9TfQbE/XQ== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - scheduler@^0.16.2: version "0.16.2" resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.16.2.tgz#f74cd9d33eff6fc554edfb79864868e4819132c1" @@ -28404,7 +25358,7 @@ schema-utils@1.0.0, schema-utils@^1.0.0: ajv-errors "^1.0.0" ajv-keywords "^3.1.0" -schema-utils@^0.4.4: +schema-utils@^0.4.4, schema-utils@^0.4.5: version "0.4.7" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.7.tgz#ba74f597d2be2ea880131746ee17d0a093c68187" integrity sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ== @@ -28412,14 +25366,6 @@ schema-utils@^0.4.4: ajv "^6.1.0" ajv-keywords "^3.1.0" -schema-utils@^0.4.5: - version "0.4.5" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.5.tgz#21836f0608aac17b78f9e3e24daff14a5ca13a3e" - integrity sha512-yYrjb9TX2k/J1Y5UNy3KYdZq10xhYcF8nMpAW6o3hy6Q8WSIEf9lJHG/ePnOBfziPM3fvQwfOwa13U/Fh8qTfA== - dependencies: - ajv "^6.1.0" - ajv-keywords "^3.1.0" - scmp@0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/scmp/-/scmp-0.0.3.tgz#3648df2d7294641e7f78673ffc29681d9bad9073" @@ -28448,14 +25394,6 @@ scrypt.js@0.2.0: scrypt "^6.0.2" scryptsy "^1.2.1" -scrypt.js@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/scrypt.js/-/scrypt.js-0.2.1.tgz#cc3f751933d6bac7a4bedf5301d7596e8146cdcd" - integrity sha512-XMoqxwABdotuW+l+qACmJ/h0kVSCgMPZXpbncA/zyBO90z/NnDISzVw+xJ4tUY+X/Hh0EFT269OYHm26VCPgmA== - dependencies: - scrypt "^6.0.2" - scryptsy "^1.2.1" - scrypt.js@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/scrypt.js/-/scrypt.js-0.3.0.tgz#6c62d61728ad533c8c376a2e5e3e86d41a95c4c0" @@ -28521,16 +25459,16 @@ seed-random@2.2.0: resolved "https://registry.yarnpkg.com/seed-random/-/seed-random-2.2.0.tgz#2a9b19e250a817099231a5b99a4daf80b7fbed54" integrity sha1-KpsZ4lCoFwmSMaW5mk2vgLf77VQ= -seedrandom@2.4.4, seedrandom@^2.4.2: - version "2.4.4" - resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-2.4.4.tgz#b25ea98632c73e45f58b77cfaa931678df01f9ba" - integrity sha512-9A+PDmgm+2du77B5i0Ip2cxOqqHjgNxnBgglxLcX78A2D6c2rTo61z4jnVABpF4cKeDMDG+cmXXvdnqse2VqMA== - seedrandom@3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-3.0.1.tgz#eb3dde015bcf55df05a233514e5df44ef9dce083" integrity sha512-1/02Y/rUeU1CJBAGLebiC5Lbo5FnB22gQbIFFYTLkwvp1xdABZJH1sn4ZT1MzXmPpzv+Rf/Lu2NcsLJiK4rcDg== +seedrandom@^2.4.2: + version "2.4.4" + resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-2.4.4.tgz#b25ea98632c73e45f58b77cfaa931678df01f9ba" + integrity sha512-9A+PDmgm+2du77B5i0Ip2cxOqqHjgNxnBgglxLcX78A2D6c2rTo61z4jnVABpF4cKeDMDG+cmXXvdnqse2VqMA== + seek-bzip@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/seek-bzip/-/seek-bzip-1.0.5.tgz#cfe917cb3d274bcffac792758af53173eb1fabdc" @@ -28572,16 +25510,11 @@ semver-greatest-satisfied-range@^1.1.0: dependencies: sver-compat "^1.5.0" -"semver@2 >=2.2.1 || 3.x || 4 || 5", "semver@2.x || 3.x || 4 || 5", "semver@4 || 5", "semver@^2.3.0 || 3.x || 4 || 5", semver@^5.6.0, semver@^5.7.0: +"semver@2 >=2.2.1 || 3.x || 4 || 5", "semver@2 || 3 || 4 || 5", "semver@2.x || 3.x || 4 || 5", "semver@4 || 5", "semver@^2.3.0 || 3.x || 4 || 5", semver@^5.0.1, semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0, semver@^5.7.0: version "5.7.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b" integrity sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA== -"semver@2 || 3 || 4 || 5", semver@5.5.0, semver@^5.0.1, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" - integrity sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA== - semver@4.3.2: version "4.3.2" resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.2.tgz#c7a07158a80bedd052355b770d82d6640f803be7" @@ -28592,7 +25525,12 @@ semver@5.3.0, semver@~5.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" integrity sha1-myzl094C0XxgEq0yaqa00M9U+U8= -semver@6.2.0, semver@^6.2.0: +semver@5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" + integrity sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA== + +semver@6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.2.0.tgz#4d813d9590aaf8a9192693d6c85b9344de5901db" integrity sha512-jdFC1VdUGT/2Scgbimf7FSx9iJLXoqfglSF+gJeuNWVpiE37OIbc1jywR/GJyFdz3mnkz2/id0L0J/cr0izR5A== @@ -28602,22 +25540,7 @@ semver@^4.1.0: resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" integrity sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto= -semver@^5.0.3, semver@^5.1.0, semver@^5.5: - version "5.6.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" - integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== - -semver@^5.5.1: - version "5.5.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.1.tgz#7dfdd8814bdb7cabc7be0fb1d734cfb66c940477" - integrity sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw== - -semver@^6.0.0: - version "6.1.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.1.1.tgz#53f53da9b30b2103cd4f15eab3a18ecbcb210c9b" - integrity sha512-rWYq2e5iYW+fFe/oPPtYJxYgjBm8sC4rmoGdUOgBB7VnwKt6HrL793l2voH1UlsyYZpJ4g0wfjnTEO1s1NP2eQ== - -semver@^6.1.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: +semver@^6.0.0, semver@^6.1.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== @@ -28752,17 +25675,12 @@ serialize-javascript@1.4.0: resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.4.0.tgz#7c958514db6ac2443a8abc062dc9f7886a7f6005" integrity sha1-fJWFFNtqwkQ6irwGLcn3iGp/YAU= -serialize-javascript@^1.4.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.5.0.tgz#1aa336162c88a890ddad5384baebc93a655161fe" - integrity sha512-Ga8c8NjAAp46Br4+0oZ2WxJCwIzwP60Gq1YPgU+39PiTVxyed/iKE/zyZI6+UlVYH5Q4PaQdHhcegIFPZTUfoQ== - -serialize-javascript@^1.7.0: +serialize-javascript@^1.4.0, serialize-javascript@^1.7.0: version "1.9.1" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.9.1.tgz#cfc200aef77b600c47da9bb8149c943e798c2fdb" integrity sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A== -serve-static@1.13.2, serve-static@^1.13.1: +serve-static@1.13.2: version "1.13.2" resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1" integrity sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw== @@ -28772,7 +25690,7 @@ serve-static@1.13.2, serve-static@^1.13.1: parseurl "~1.3.2" send "0.16.2" -serve-static@1.14.1: +serve-static@1.14.1, serve-static@^1.13.1: version "1.14.1" resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== @@ -28841,11 +25759,6 @@ setimmediate@^1.0.4, setimmediate@^1.0.5: resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= -setprototypeof@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04" - integrity sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ= - setprototypeof@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" @@ -28872,7 +25785,7 @@ sha1@^1.1.1: charenc ">= 0.0.1" crypt ">= 0.0.1" -sha3@1.2.3, sha3@^1.1.0, sha3@^1.2.2: +sha3@1.2.3, sha3@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/sha3/-/sha3-1.2.3.tgz#ed5958fa8331df1b1b8529ca9fdf225a340c5418" integrity sha512-sOWDZi8cDBRkLfWOw18wvJyNblXDHzwMGnRWut8zNNeIeLnmMRO17bjpLc7OzMuj1ASUgx2IyohzUCAl+Kx5vA== @@ -29170,13 +26083,6 @@ sntp@1.x.x: dependencies: hoek "2.x.x" -sntp@2.x.x: - version "2.1.0" - resolved "https://registry.yarnpkg.com/sntp/-/sntp-2.1.0.tgz#2c6cec14fedc2222739caf9b5c3d85d1cc5a2cc8" - integrity sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg== - dependencies: - hoek "4.x.x" - snyk-config@^2.2.1: version "2.2.3" resolved "https://registry.yarnpkg.com/snyk-config/-/snyk-config-2.2.3.tgz#8e09bb98602ad044954d30a9fc1695ab5b6042fa" @@ -29438,7 +26344,7 @@ socks-proxy-agent@^3.0.1: agent-base "^4.1.0" socks "^1.1.10" -socks-proxy-agent@^4.0.0: +socks-proxy-agent@^4.0.0, socks-proxy-agent@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz#3c8991f3145b2799e70e11bd5fbc8b1963116386" integrity sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg== @@ -29446,14 +26352,6 @@ socks-proxy-agent@^4.0.0: agent-base "~4.2.1" socks "~2.3.2" -socks-proxy-agent@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-4.0.1.tgz#5936bf8b707a993079c6f37db2091821bffa6473" - integrity sha512-Kezx6/VBguXOsEe5oU3lXYyKMi4+gva72TwJ7pQY5JfqUx2nMk7NXA6z/mpNqIlfQjWYVfeuNvQjexiTaTn6Nw== - dependencies: - agent-base "~4.2.0" - socks "~2.2.0" - socks@^1.1.10: version "1.1.10" resolved "https://registry.yarnpkg.com/socks/-/socks-1.1.10.tgz#5b8b7fc7c8f341c53ed056e929b7bf4de8ba7b5a" @@ -29462,14 +26360,6 @@ socks@^1.1.10: ip "^1.1.4" smart-buffer "^1.0.13" -socks@~2.2.0: - version "2.2.3" - resolved "https://registry.yarnpkg.com/socks/-/socks-2.2.3.tgz#7399ce11e19b2a997153c983a9ccb6306721f2dc" - integrity sha512-+2r83WaRT3PXYoO/1z+RDEBE7Z2f9YcdQnJ0K/ncXXbV5gJ6wYfNAebYFYiiUjM6E4JyXnPY8cimwyvFYHVUUA== - dependencies: - ip "^1.1.5" - smart-buffer "4.0.2" - socks@~2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/socks/-/socks-2.3.2.tgz#ade388e9e6d87fdb11649c15746c578922a5883e" @@ -29490,7 +26380,7 @@ solc@0.5.0: semver "^5.5.0" yargs "^11.0.0" -solc@0.5.8, solc@^0.5.0: +solc@0.5.8: version "0.5.8" resolved "https://registry.yarnpkg.com/solc/-/solc-0.5.8.tgz#a0aa2714082fc406926f5cb384376d7408080611" integrity sha512-RQ2SlwPBOBSV7ktNQJkvbiQks3t+3V9dsqD014EdstxnJzSxBuOvbt3P5QXpNPYW1DsEmF7dhOaT3JL7yEae/A== @@ -29515,7 +26405,7 @@ solc@^0.4.2: semver "^5.3.0" yargs "^4.7.1" -solc@^0.5.5: +solc@^0.5.0, solc@^0.5.5, solc@^0.5.8: version "0.5.11" resolved "https://registry.yarnpkg.com/solc/-/solc-0.5.11.tgz#5905261191d01befd78ef52610a006820022ee8f" integrity sha512-F8avCCVDYnJzvIm/ITsU11GFNdFI4HaNsME+zw9lK5a3ojD3LZN2Op2cIfWg7w1HeRYRiMOU1dM77saX6jUIKw== @@ -29529,20 +26419,6 @@ solc@^0.5.5: tmp "0.0.33" yargs "^13.2.0" -solc@^0.5.8: - version "0.5.10" - resolved "https://registry.yarnpkg.com/solc/-/solc-0.5.10.tgz#e57d789b1028f3d35f7989e5134d6ddc0e3b32aa" - integrity sha512-Stdrh/MDkopsXYPRzPehTNYuV80Grr2CnQMuFvWj+EeRVbe3piGHxW47KebWn1sGdmK8FLaMfUehccqJP0KovQ== - dependencies: - command-exists "^1.2.8" - fs-extra "^0.30.0" - keccak "^1.0.2" - memorystream "^0.3.1" - require-from-string "^2.0.0" - semver "^5.5.0" - tmp "0.0.33" - yargs "^11.0.0" - solhint@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/solhint/-/solhint-2.0.0.tgz#67aa3499d2427a3a6abe8600f4a920aa9720a83f" @@ -29617,14 +26493,6 @@ source-map-support@0.5.12: buffer-from "^1.0.0" source-map "^0.6.0" -source-map-support@0.5.9, source-map-support@^0.5.9: - version "0.5.9" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.9.tgz#41bc953b2534267ea2d605bccfa7bfa3111ced5f" - integrity sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - source-map-support@^0.4.15: version "0.4.18" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" @@ -29632,15 +26500,7 @@ source-map-support@^0.4.15: dependencies: source-map "^0.5.6" -source-map-support@^0.5.0: - version "0.5.5" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.5.tgz#0d4af9e00493e855402e8ec36ebed2d266fceb90" - integrity sha512-mR7/Nd5l1z6g99010shcXJiNEaf3fEtmLhRB/sBcQVJGodcHCULPp2y4Sfa43Kv2zq7T+Izmfp/WHCR6dYkQCA== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map-support@^0.5.11, source-map-support@^0.5.7, source-map-support@~0.5.12: +source-map-support@^0.5.0, source-map-support@^0.5.11, source-map-support@^0.5.6, source-map-support@^0.5.7, source-map-support@^0.5.9, source-map-support@~0.5.12, source-map-support@~0.5.9: version "0.5.13" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== @@ -29648,22 +26508,6 @@ source-map-support@^0.5.11, source-map-support@^0.5.7, source-map-support@~0.5.1 buffer-from "^1.0.0" source-map "^0.6.0" -source-map-support@^0.5.6: - version "0.5.6" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.6.tgz#4435cee46b1aab62b8e8610ce60f788091c51c13" - integrity sha512-N4KXEz7jcKqPf2b2vZF11lQIz9W5ZMuUcIOGj243lduidkf2fjkVKJS9vNxVWn3u/uxX38AcE8U9nnH9FPcq+g== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map-support@~0.5.10, source-map-support@~0.5.9: - version "0.5.11" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.11.tgz#efac2ce0800355d026326a0ca23e162aeac9a4e2" - integrity sha512-//sajEx/fGL3iw6fltKMdPvy8kL3kJ2O3iuYlRoT3k9Kb4BjOoZ+BZzaNHeuaruSt+Kf3Zk9tnfAQg9/AJqUVQ== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - source-map-url@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" @@ -29874,7 +26718,7 @@ static-extend@^0.1.1: define-property "^0.2.5" object-copy "^0.1.0" -"statuses@>= 1.2.1 < 2", "statuses@>= 1.3.1 < 2", "statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0: +"statuses@>= 1.2.1 < 2", "statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= @@ -29934,14 +26778,7 @@ stream-each@^1.1.0: end-of-stream "^1.1.0" stream-shift "^1.0.0" -stream-events@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/stream-events/-/stream-events-1.0.4.tgz#73bfd4007b8f677b46ec699f14e9e2304c2f0a9e" - integrity sha512-D243NJaYs/xBN2QnoiMDY7IesJFIK7gEhnvAYqJa5JvDdnh2dC4qDBwlCf0ohPpX2QRlA/4gnbnPd3rs3KxVcA== - dependencies: - stubs "^3.0.0" - -stream-events@^1.0.4, stream-events@^1.0.5: +stream-events@^1.0.1, stream-events@^1.0.4, stream-events@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/stream-events/-/stream-events-1.0.5.tgz#bbc898ec4df33a4902d892333d47da9bf1c406d5" integrity sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg== @@ -30069,14 +26906,7 @@ string.prototype.trim@^1.1.2, string.prototype.trim@~1.1.2: es-abstract "^1.5.0" function-bind "^1.0.2" -string_decoder@^1.0.0, string_decoder@^1.0.3, string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -string_decoder@^1.1.1: +string_decoder@^1.0.0, string_decoder@^1.0.3, 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== @@ -30088,16 +26918,18 @@ string_decoder@~0.10.x: resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + stringstream@~0.0.4: version "0.0.6" resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.6.tgz#7880225b0d4ad10e30927d167a1d6f2fd3b33a72" integrity sha512-87GEBAkegbBcweToUrdzf3eLhWNg06FJTebl4BVJz/JgWy8CvEr9dRtX5qWphiynMSQlxxi+QqN0z5T32SLlhA== -stringstream@~0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" - integrity sha1-TkhM1N5aC7vuGORjB3EKioFiGHg= - strip-ansi@3.0.1, strip-ansi@^3.0.0, strip-ansi@^3.0.1, strip-ansi@~3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" @@ -30112,14 +26944,7 @@ strip-ansi@^4.0.0, strip-ansi@~4.0.0: dependencies: ansi-regex "^3.0.0" -strip-ansi@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.0.0.tgz#f78f68b5d0866c20b2c9b8c61b5298508dc8756f" - integrity sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow== - dependencies: - ansi-regex "^4.0.0" - -strip-ansi@^5.1.0, strip-ansi@^5.2.0: +strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== @@ -30311,15 +27136,7 @@ supertap@^1.0.0: serialize-error "^2.1.0" strip-ansi "^4.0.0" -supertest@^3.2.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/supertest/-/supertest-3.3.0.tgz#79b27bd7d34392974ab33a31fa51a3e23385987e" - integrity sha512-dMQSzYdaZRSANH5LL8kX3UpgK9G1LRh/jnggs/TI0W2Sz7rkMx9Y48uia3K9NgcaWEV28tYkBnXE4tiFC77ygQ== - dependencies: - methods "^1.1.2" - superagent "^3.8.3" - -supertest@^3.4.2: +supertest@^3.2.0, supertest@^3.4.2: version "3.4.2" resolved "https://registry.yarnpkg.com/supertest/-/supertest-3.4.2.tgz#bad7de2e43d60d27c8caeb8ab34a67c8a5f71aad" integrity sha512-WZWbwceHUo2P36RoEIdXvmqfs47idNNZjCuJOqDz6rvtkk8ym56aU5oglORCpPeXGxT7l9rkJ41+O1lffQXYSA== @@ -30341,7 +27158,7 @@ supports-color@4.4.0: dependencies: has-flag "^2.0.0" -supports-color@5.4.0, supports-color@^5.4.0: +supports-color@5.4.0: version "5.4.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54" integrity sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w== @@ -30374,7 +27191,7 @@ supports-color@^3.1.0, supports-color@^3.1.2, supports-color@^3.2.3: dependencies: has-flag "^1.0.0" -supports-color@^5.0.0, supports-color@^5.2.0, supports-color@^5.3.0, supports-color@^5.5.0: +supports-color@^5.0.0, supports-color@^5.2.0, supports-color@^5.3.0, supports-color@^5.4.0, supports-color@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== @@ -30506,36 +27323,12 @@ tapable@^0.2.7, tapable@~0.2.5: resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.8.tgz#99372a5c999bf2df160afc0d74bed4f47948cd22" integrity sha1-mTcqXJmb8t8WCvwNdL7U9HlIzSI= -tapable@^1.0.0, tapable@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.1.tgz#4d297923c5a72a42360de2ab52dadfaaec00018e" - integrity sha512-9I2ydhj8Z9veORCw5PRm4u9uebCn0mcCa6scWoNcbZ6dAtoo2618u9UUzxgmsCOreJpqDDuv61LvwofW7hLcBA== - -tapable@^1.1.3: +tapable@^1.0.0, tapable@^1.1.0, tapable@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== -tape@^4.4.0: - version "4.10.2" - resolved "https://registry.yarnpkg.com/tape/-/tape-4.10.2.tgz#129fcf62f86df92687036a52cce7b8ddcaffd7a6" - integrity sha512-mgl23h7W2yuk3N85FOYrin2OvThTYWdwbk6XQ1pr2PMJieyW2FM/4Bu/+kD/wecb3aZ0Enm+Syinyq467OPq2w== - dependencies: - deep-equal "~1.0.1" - defined "~1.0.0" - for-each "~0.3.3" - function-bind "~1.1.1" - glob "~7.1.4" - has "~1.0.3" - inherits "~2.0.3" - minimist "~1.2.0" - object-inspect "~1.6.0" - resolve "~1.10.1" - resumer "~0.0.0" - string.prototype.trim "~1.1.2" - through "~2.3.8" - -tape@^4.6.3, tape@^4.8.0: +tape@^4.4.0, tape@^4.6.3, tape@^4.8.0: version "4.11.0" resolved "https://registry.yarnpkg.com/tape/-/tape-4.11.0.tgz#63d41accd95e45a23a874473051c57fdbc58edc1" integrity sha512-yixvDMX7q7JIs/omJSzSZrqulOV51EC9dK8dM0TzImTIkHWfe2/kFyL5v+d9C+SrCMaICk59ujsqFAVidDqDaA== @@ -30564,7 +27357,7 @@ tar-fs@^1.13.0, tar-fs@^1.15.3, tar-fs@^1.16.2: pump "^1.0.0" tar-stream "^1.1.2" -tar-stream@^1.1.2, tar-stream@^1.5.4: +tar-stream@^1.1.2, tar-stream@^1.5.2, tar-stream@^1.5.4: version "1.6.2" resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.2.tgz#8ea55dab37972253d9a9af90fdcd559ae435c555" integrity sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A== @@ -30577,19 +27370,6 @@ tar-stream@^1.1.2, tar-stream@^1.5.4: to-buffer "^1.1.1" xtend "^4.0.0" -tar-stream@^1.5.2: - version "1.6.0" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.0.tgz#a50efaa7b17760b82c27b3cae4a301a8254a5715" - integrity sha512-lh2iAPG/BHNmN6WB9Ybdynk9rEJ5GD/dy4zscHmVlwa1dq2tpE+BH78i5vjYwYVWEaOXGBjzxr89aVACF17Cpw== - dependencies: - bl "^1.0.0" - buffer-alloc "^1.1.0" - end-of-stream "^1.0.0" - fs-constants "^1.0.0" - readable-stream "^2.0.0" - to-buffer "^1.1.0" - xtend "^4.0.0" - tar-stream@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.1.0.tgz#d1aaa3661f05b38b5acc9b7020efdca5179a2cc3" @@ -30707,21 +27487,7 @@ term-size@^1.2.0: dependencies: execa "^0.7.0" -terser-webpack-plugin@^1.1.0: - version "1.2.3" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.2.3.tgz#3f98bc902fac3e5d0de730869f50668561262ec8" - integrity sha512-GOK7q85oAb/5kE12fMuLdn2btOS9OBZn4VsecpHDywoUC/jLhSAKOiYo0ezx7ss2EXPMzyEWFoE0s1WLE+4+oA== - dependencies: - cacache "^11.0.2" - find-cache-dir "^2.0.0" - schema-utils "^1.0.0" - serialize-javascript "^1.4.0" - source-map "^0.6.1" - terser "^3.16.1" - webpack-sources "^1.1.0" - worker-farm "^1.5.2" - -terser-webpack-plugin@^1.4.1: +terser-webpack-plugin@^1.1.0, terser-webpack-plugin@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.1.tgz#61b18e40eaee5be97e771cdbb10ed1280888c2b4" integrity sha512-ZXmmfiwtCLfz8WKZyYUuuHf3dMYEjg8NrjHMb0JqHVHVOSkzp3cW2/XG1fP3tRhqEqSzMwzzRQGtAPbs4Cncxg== @@ -30745,15 +27511,6 @@ terser@3.16.1: source-map "~0.6.1" source-map-support "~0.5.9" -terser@^3.16.1: - version "3.17.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-3.17.0.tgz#f88ffbeda0deb5637f9d24b0da66f4e15ab10cb2" - integrity sha512-/FQzzPJmCpjAH9Xvk2paiWrFq+5M6aVOf+2KRbwhByISDX/EujxsK+BAvrhb6H+2rtrLCHK9N01wO014vrIwVQ== - dependencies: - commander "^2.19.0" - source-map "~0.6.1" - source-map-support "~0.5.10" - terser@^4.1.2: version "4.3.2" resolved "https://registry.yarnpkg.com/terser/-/terser-4.3.2.tgz#ed830de484b0103652799063e605618e80f97f93" @@ -30876,15 +27633,7 @@ through2@2.0.1: readable-stream "~2.0.0" xtend "~4.0.0" -through2@^2.0.0, through2@^2.0.2, through2@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" - integrity sha1-AARWmzfHx0ujnEPzzteNGtlBQL4= - dependencies: - readable-stream "^2.1.5" - xtend "~4.0.1" - -through2@^2.0.1, through2@~2.0.0: +through2@^2.0.0, through2@^2.0.1, through2@^2.0.2, through2@^2.0.3, through2@~2.0.0: version "2.0.5" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== @@ -31034,7 +27783,7 @@ to-arraybuffer@^1.0.0: resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= -to-buffer@^1.1.0, to-buffer@^1.1.1: +to-buffer@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80" integrity sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg== @@ -31134,14 +27883,7 @@ touch@^3.1.0: dependencies: nopt "~1.0.10" -tough-cookie@>=2.3.3, tough-cookie@^2.3.3, tough-cookie@~2.3.0, tough-cookie@~2.3.3: - version "2.3.4" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.4.tgz#ec60cee38ac675063ffc97a5c18970578ee83655" - integrity sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA== - dependencies: - punycode "^1.4.1" - -tough-cookie@~2.4.3: +tough-cookie@>=2.3.3, tough-cookie@^2.3.3, tough-cookie@~2.4.3: version "2.4.3" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== @@ -31149,6 +27891,13 @@ tough-cookie@~2.4.3: psl "^1.1.24" punycode "^1.4.1" +tough-cookie@~2.3.0: + version "2.3.4" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.4.tgz#ec60cee38ac675063ffc97a5c18970578ee83655" + integrity sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA== + dependencies: + punycode "^1.4.1" + toxic@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/toxic/-/toxic-1.0.0.tgz#f1154d8b6ac21875ac943a9f7408df2dfe164ea2" @@ -31285,15 +28034,6 @@ truffle-config@^1.1.10, truffle-config@^1.1.12: truffle-error "^0.0.4" truffle-provider "^0.1.9" -truffle-contract-schema@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/truffle-contract-schema/-/truffle-contract-schema-2.0.1.tgz#9bf821d32e26e674ba15eb5d40f96b10b1c9d568" - integrity sha1-m/gh0y4m5nS6FetdQPlrELHJ1Wg= - dependencies: - ajv "^5.1.1" - crypto-js "^3.1.9-1" - debug "^3.1.0" - truffle-contract-schema@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/truffle-contract-schema/-/truffle-contract-schema-2.0.2.tgz#9db59e3a5ea85b63dca453a2dba9897c2c3523fd" @@ -31320,18 +28060,7 @@ truffle-contract-sources@^0.1.3: debug "^4.1.0" glob "^7.1.2" -truffle-contract@^3.0.6: - version "3.0.6" - resolved "https://registry.yarnpkg.com/truffle-contract/-/truffle-contract-3.0.6.tgz#2ef6fc32d7faafa9f4aed8e50001a9fdea342192" - integrity sha1-Lvb8Mtf6r6n0rtjlAAGp/eo0IZI= - dependencies: - ethjs-abi "0.1.8" - truffle-blockchain-utils "^0.0.5" - truffle-contract-schema "^2.0.1" - truffle-error "^0.0.3" - web3 "0.20.6" - -truffle-contract@^3.0.7: +truffle-contract@^3.0.6, truffle-contract@^3.0.7: version "3.0.7" resolved "https://registry.yarnpkg.com/truffle-contract/-/truffle-contract-3.0.7.tgz#487b2e1e9c5f01d223148766f6f320ba16bb4f63" integrity sha512-av4MTJDP29PI3oVh8TrvRzRHt+nZJH8ODSiil/TfcXrKMSes52DTA5LHj00siLvcadkxUgoEZfEZ04qqhNGoiA== @@ -31421,12 +28150,7 @@ truffle-provider@^0.1.9: truffle-interface-adapter "^0.1.5" web3 "1.0.0-beta.37" -truffle-provisioner@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/truffle-provisioner/-/truffle-provisioner-0.1.1.tgz#5a8327d62511ef23c950d3aa862610a7c377e2aa" - integrity sha1-WoMn1iUR7yPJUNOqhiYQp8N34qo= - -truffle-provisioner@^0.1.4: +truffle-provisioner@^0.1.1, truffle-provisioner@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/truffle-provisioner/-/truffle-provisioner-0.1.4.tgz#a470f7e603d069b481481dba92f5c9d2f1a8526a" integrity sha512-d4GhAsS4bEtYIfuedaFl9k22o7UJOsmgMZM8M3fQYI0uAGt9ApEGEL0Yvdy7/uWw/0T1796ZVe+EuzlbcjaiUQ== @@ -31559,7 +28283,7 @@ ts-log@2.1.4: resolved "https://registry.yarnpkg.com/ts-log/-/ts-log-2.1.4.tgz#063c5ad1cbab5d49d258d18015963489fb6fb59a" integrity sha512-P1EJSoyV+N3bR/IWFeAqXzKPZwHpnLY6j7j58mAvewHRipo+BQM2Y1f9Y9BjEQznKwgqqZm7H8iuixmssU7tYQ== -ts-node@8.3.0, ts-node@^8.3.0: +ts-node@8.3.0: version "8.3.0" resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-8.3.0.tgz#e4059618411371924a1fb5f3b125915f324efb57" integrity sha512-dyNS/RqyVTDcmNM4NIBAeDMpsAdaQ+ojdf0GOLqE6nwJOgzEkdRNzJywhDfwnuvB10oa6NLVG1rUJQCpRN7qoQ== @@ -31570,7 +28294,7 @@ ts-node@8.3.0, ts-node@^8.3.0: source-map-support "^0.5.6" yn "^3.0.0" -ts-node@^8.4.1: +ts-node@^8.3.0, ts-node@^8.4.1: version "8.4.1" resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-8.4.1.tgz#270b0dba16e8723c9fa4f9b4775d3810fd994b4f" integrity sha512-5LpRN+mTiCs7lI5EtbXmF/HfMeCjzt7DH9CZwtkr6SywStrNQC723wG+aOWFiLNn7zT3kD/RnFqi3ZUfr4l5Qw== @@ -31604,26 +28328,21 @@ tsconfig-paths@^3.8.0: minimist "^1.2.0" strip-bom "^3.0.0" -tslib@1.10.0, tslib@^1, tslib@^1.10.0: +tslib@1.10.0, tslib@^1, tslib@^1.10.0, tslib@^1.8.0, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.1, tslib@^1.9.3: version "1.10.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== -tslib@1.9.0, tslib@^1.8.0, tslib@^1.8.1, tslib@^1.9.0: +tslib@1.9.0: version "1.9.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.0.tgz#e37a86fda8cbbaf23a057f473c9f4dc64e5fc2e8" integrity sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ== -tslib@1.9.3, tslib@^1.9.3: +tslib@1.9.3: version "1.9.3" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ== -tslib@^1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.1.tgz#a5d1f0532a49221c87755cfcc89ca37197242ba7" - integrity sha512-avfPS28HmGLLc2o4elcc2EIq2FcH++Yo5YxpBZi9Yw93BCTGFthI4HPE4Rpep6vSYQaK8e69PelM44tPj+RaQg== - tslint-config-prettier@^1.18.0: version "1.18.0" resolved "https://registry.yarnpkg.com/tslint-config-prettier/-/tslint-config-prettier-1.18.0.tgz#75f140bde947d35d8f0d238e0ebf809d64592c37" @@ -31695,14 +28414,7 @@ tsutils@^2.29.0: dependencies: tslib "^1.8.1" -tsutils@^3.0.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.10.0.tgz#6f1c95c94606e098592b0dff06590cf9659227d6" - integrity sha512-q20XSMq7jutbGB8luhKKsQldRKWvyBO2BGqni3p4yq8Ys9bEP/xQw3KepKmMRt9gJ4lvQSScrihJrcKdKoSU7Q== - dependencies: - tslib "^1.8.1" - -tsutils@^3.7.0, tsutils@^3.9.1: +tsutils@^3.0.0, tsutils@^3.7.0, tsutils@^3.9.1: version "3.17.1" resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759" integrity sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g== @@ -31806,15 +28518,7 @@ type-fest@^0.8.0: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== -type-is@^1.6.16, type-is@~1.6.15, type-is@~1.6.16: - version "1.6.16" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194" - integrity sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q== - dependencies: - media-typer "0.3.0" - mime-types "~2.1.18" - -type-is@~1.6.17, type-is@~1.6.18: +type-is@^1.6.16, type-is@~1.6.16, type-is@~1.6.17, type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== @@ -31881,17 +28585,7 @@ typescript-tuple@^2.2.1: dependencies: typescript-compare "^0.0.2" -typescript@^3.2.2: - version "3.3.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.3.3.tgz#f1657fc7daa27e1a8930758ace9ae8da31403221" - integrity sha512-Y21Xqe54TBVp+VDSNbuDYdGw0BpoR/Q6wo/+35M8PAU0vipahnyduJWirxxdxjsAkS7hue53x2zp8gz7F05u0A== - -typescript@^3.5.3: - version "3.5.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.5.3.tgz#c830f657f93f1ea846819e929092f5fe5983e977" - integrity sha512-ACzBtm/PhXBDId6a6sDJfroT2pOWt/oOnk4/dElG5G33ZL776N3Y6/6bKZJBFpd+b05F3Ct9qDjMeJmRWtE2/g== - -typescript@^3.6.4: +typescript@^3.2.2, typescript@^3.5.3, typescript@^3.6.4: version "3.6.4" resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.6.4.tgz#b18752bb3792bc1a0281335f7f6ebf1bbfc5b91d" integrity sha512-unoCll1+l+YK4i4F8f22TaNVPRHcD9PA3yCuZ8g5e0qGqlVlJ/8FSateOLLSagn+Yg5+ZwuPkL8LFUc0Jcvksg== @@ -31923,7 +28617,7 @@ u2f-api@0.2.7: resolved "https://registry.yarnpkg.com/u2f-api/-/u2f-api-0.2.7.tgz#17bf196b242f6bf72353d9858e6a7566cc192720" integrity sha512-fqLNg8vpvLOD5J/z4B6wpPg4Lvowz1nJ9xdHcCzdUPKcFE/qNCceV2gNZxSJd5vhAZemHr/K/hbzVA0zxB5mkg== -ua-parser-js@^0.7.18, ua-parser-js@^0.7.19, ua-parser-js@^0.7.9: +ua-parser-js@^0.7.18, ua-parser-js@^0.7.19: version "0.7.20" resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.20.tgz#7527178b82f6a62a0f243d1f94fd30e3e3c21098" integrity sha512-8OaIKfzL5cpx8eCMAhhvTlft8GYF8b2eQr6JkCyVdrgjcytyOmPCXrqXFcUnhonRpLlh5yxEZVohm6mzaowUOw== @@ -32084,11 +28778,6 @@ unicode-match-property-ecmascript@^1.0.4: unicode-canonical-property-names-ecmascript "^1.0.4" unicode-property-aliases-ecmascript "^1.0.4" -unicode-match-property-value-ecmascript@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.0.2.tgz#9f1dc76926d6ccf452310564fd834ace059663d4" - integrity sha512-Rx7yODZC1L/T8XKo/2kNzVAQaRE88AaMvI1EF/Xnj3GW2wzN6fop9DDWuFAKUVFH7vozkz26DzP0qyWLKLIVPQ== - unicode-match-property-value-ecmascript@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz#5b4b426e08d13a80365e0d657ac7a6c1ec46a277" @@ -32159,14 +28848,7 @@ union-value@^1.0.0: is-extendable "^0.1.1" set-value "^0.4.3" -unique-filename@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.0.tgz#d05f2fe4032560871f30e93cbe735eea201514f3" - integrity sha1-0F8v5AMlYIcfMOk8vnNe6iAVFPM= - dependencies: - unique-slug "^2.0.0" - -unique-filename@^1.1.1, unique-filename@~1.1.0: +unique-filename@^1.1.0, unique-filename@^1.1.1, unique-filename@~1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== @@ -32236,12 +28918,7 @@ 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= - -unorm@^1.4.1: +unorm@^1.3.3, unorm@^1.4.1: version "1.6.0" resolved "https://registry.yarnpkg.com/unorm/-/unorm-1.6.0.tgz#029b289661fba714f1a9af439eb51d9b16c205af" integrity sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA== @@ -32264,17 +28941,7 @@ unzip-response@^2.0.1: resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" integrity sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c= -upath@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/upath/-/upath-1.0.5.tgz#02cab9ecebe95bbec6d5fc2566325725ab6d1a73" - integrity sha512-qbKn90aDQ0YEwvXoLqj0oiuUYroLX2lVHZ+b+xwjozFasAOC4GneDq5+OaIG5Zj+jFmbz/uO+f7a9qxjktJQww== - -upath@^1.0.5: - version "1.1.0" - resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.0.tgz#35256597e46a581db4793d0ce47fa9aebfc9fabd" - integrity sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw== - -upath@^1.1.1: +upath@^1.0.5, upath@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== @@ -32321,13 +28988,6 @@ upper-case@^1.0.3, upper-case@^1.1.0, upper-case@^1.1.1, upper-case@^1.1.3: resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598" integrity sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg= -uri-js@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-3.0.2.tgz#f90b858507f81dea4dcfbb3c4c3dbfa2b557faaa" - integrity sha1-+QuFhQf4HepNz7s8TD2/orVX+qo= - dependencies: - punycode "^2.1.0" - uri-js@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" @@ -32527,7 +29187,7 @@ uuid@2.0.1: resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.1.tgz#c2a30dedb3e535d72ccf82e343941a50ba8533ac" integrity sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w= -uuid@3.3.2, uuid@^3.3.2: +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== @@ -32537,12 +29197,7 @@ uuid@^2.0.1, uuid@^2.0.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a" integrity sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho= -uuid@^3.0.0, uuid@^3.0.1, uuid@^3.1.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14" - integrity sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA== - -uuid@^3.2.1: +uuid@^3.0.0, uuid@^3.0.1, uuid@^3.1.0, uuid@^3.2.1, uuid@^3.3.2: version "3.3.3" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.3.tgz#4568f0216e78760ee1dbf3a4d2cf53e224112866" integrity sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ== @@ -32569,15 +29224,7 @@ valid-url@1.0.9, valid-url@^1, valid-url@^1.0.9: resolved "https://registry.yarnpkg.com/valid-url/-/valid-url-1.0.9.tgz#1c14479b40f1397a75782f115e4086447433a200" integrity sha1-HBRHm0DxOXp1eC8RXkCGRHQzogA= -validate-npm-package-license@^3.0.1: - version "3.0.3" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz#81643bcbef1bdfecd4623793dc4648948ba98338" - integrity sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g== - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - -validate-npm-package-license@^3.0.3, validate-npm-package-license@~3.0.1: +validate-npm-package-license@^3.0.1, validate-npm-package-license@^3.0.3, validate-npm-package-license@~3.0.1: version "3.0.4" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== @@ -32676,13 +29323,6 @@ vlq@^1.0.0: resolved "https://registry.yarnpkg.com/vlq/-/vlq-1.0.1.tgz#c003f6e7c0b4c1edd623fd6ee50bbc0d6a1de468" integrity sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w== -vm-browserify@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73" - integrity sha1-XX6kW7755Kb/ZflUOOCofDV9WnM= - dependencies: - indexof "0.0.1" - vm-browserify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.0.1.tgz#a15d7762c4c48fa6bf9f3309a21340f00ed23063" @@ -32776,15 +29416,6 @@ weak-map@^1.0.5: resolved "https://registry.yarnpkg.com/weak-map/-/weak-map-1.0.5.tgz#79691584d98607f5070bd3b70a40e6bb22e401eb" integrity sha1-eWkVhNmGB/UHC9O3CkDmuyLkAes= -web3-bzz@1.0.0-beta.35: - version "1.0.0-beta.35" - resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.0.0-beta.35.tgz#9d5e1362b3db2afd77d65619b7cd46dd5845c192" - integrity sha512-BhAU0qhlr8zltm4gs/+P1gki2VkxHJaM2Rrh4DGesDW0lzwufRoNvWFlwx1bKHoFPWNbSmm9PRkHOYOINL/Tgw== - dependencies: - got "7.1.0" - swarm-js "0.1.37" - underscore "1.8.3" - web3-bzz@1.0.0-beta.37: version "1.0.0-beta.37" resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.0.0-beta.37.tgz#59e3e4f5a9d732731008fe9165c3ec8bf85d502f" @@ -32803,15 +29434,6 @@ web3-bzz@1.2.1: swarm-js "0.1.39" underscore "1.9.1" -web3-core-helpers@1.0.0-beta.35: - version "1.0.0-beta.35" - resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.0.0-beta.35.tgz#d681d218a0c6e3283ee1f99a078ab9d3eef037f1" - integrity sha512-APOu3sEsamyqWt//8o4yq9KF25/uqGm+pQShson/sC4gKzmfJB07fLo2ond0X30E8fIqAPeVCotPXQxGciGUmA== - dependencies: - underscore "1.8.3" - web3-eth-iban "1.0.0-beta.35" - web3-utils "1.0.0-beta.35" - web3-core-helpers@1.0.0-beta.37: version "1.0.0-beta.37" resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.0.0-beta.37.tgz#04ec354b7f5c57234c309eea2bda9bf1f2fe68ba" @@ -32841,17 +29463,6 @@ web3-core-helpers@1.2.1: web3-eth-iban "1.2.1" web3-utils "1.2.1" -web3-core-method@1.0.0-beta.35: - version "1.0.0-beta.35" - resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.0.0-beta.35.tgz#fc10e2d546cf4886038e6130bd5726b0952a4e5f" - integrity sha512-jidImCide8q0GpfsO4L73qoHrbkeWgwU3uOH5DKtJtv0ccmG086knNMRgryb/o9ZgetDWLmDEsJnHjBSoIwcbA== - dependencies: - underscore "1.8.3" - web3-core-helpers "1.0.0-beta.35" - web3-core-promievent "1.0.0-beta.35" - web3-core-subscriptions "1.0.0-beta.35" - web3-utils "1.0.0-beta.35" - web3-core-method@1.0.0-beta.37: version "1.0.0-beta.37" resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.0.0-beta.37.tgz#53d148e63f818b23461b26307afdfbdaa9457744" @@ -32888,14 +29499,6 @@ web3-core-method@1.2.1: web3-core-subscriptions "1.2.1" web3-utils "1.2.1" -web3-core-promievent@1.0.0-beta.35: - version "1.0.0-beta.35" - resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.0.0-beta.35.tgz#4f1b24737520fa423fee3afee110fbe82bcb8691" - integrity sha512-GvqXqKq07OmHuVi5uNRg6k79a1/CI0ViCC+EtNv4CORHtDRmYEt5Bvdv6z6FJEiaaQkD0lKbFwNhLxutx7HItw== - dependencies: - any-promise "1.3.0" - eventemitter3 "1.1.1" - web3-core-promievent@1.0.0-beta.37: version "1.0.0-beta.37" resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.0.0-beta.37.tgz#4e51c469d0a7ac0a969885a4dbcde8504abe5b02" @@ -32912,17 +29515,6 @@ web3-core-promievent@1.2.1: any-promise "1.3.0" eventemitter3 "3.1.2" -web3-core-requestmanager@1.0.0-beta.35: - version "1.0.0-beta.35" - resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.0.0-beta.35.tgz#2b77cbf6303720ad68899b39fa7f584dc03dbc8f" - integrity sha512-S+zW2h17ZZQU9oe3yaCJE0E7aJS4C3Kf4kGPDv+nXjW0gKhQQhgVhw1Doq/aYQGqNSWJp7f1VHkz5gQWwg6RRg== - dependencies: - underscore "1.8.3" - web3-core-helpers "1.0.0-beta.35" - web3-providers-http "1.0.0-beta.35" - web3-providers-ipc "1.0.0-beta.35" - web3-providers-ws "1.0.0-beta.35" - web3-core-requestmanager@1.0.0-beta.37: version "1.0.0-beta.37" resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.0.0-beta.37.tgz#721a75df5920621bff42d9d74f7a64413675d56b" @@ -32945,15 +29537,6 @@ web3-core-requestmanager@1.2.1: web3-providers-ipc "1.2.1" web3-providers-ws "1.2.1" -web3-core-subscriptions@1.0.0-beta.35: - version "1.0.0-beta.35" - resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.0.0-beta.35.tgz#c1b76a2ad3c6e80f5d40b8ba560f01e0f4628758" - integrity sha512-gXzLrWvcGkGiWq1y33Z4Y80XI8XMrwowiQJkrPSjQ81K5PBKquOGwcMffLaKcwdmEy/NpsOXDeFo3eLE1Ghvvw== - dependencies: - eventemitter3 "1.1.1" - underscore "1.8.3" - web3-core-helpers "1.0.0-beta.35" - web3-core-subscriptions@1.0.0-beta.37: version "1.0.0-beta.37" resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.0.0-beta.37.tgz#40de5e2490cc05b15faa8f935c97fd48d670cd9a" @@ -32981,16 +29564,6 @@ web3-core-subscriptions@1.2.1: underscore "1.9.1" web3-core-helpers "1.2.1" -web3-core@1.0.0-beta.35: - version "1.0.0-beta.35" - resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.0.0-beta.35.tgz#0c44d3c50d23219b0b1531d145607a9bc7cd4b4f" - integrity sha512-ayGavbgVk4KL9Y88Uv411fBJ0SVgVfKhKEBweKYzmP0zOqneMzWt6YsyD1n6kRvjAbqA0AfUPEOKyMNjcx2tjw== - dependencies: - web3-core-helpers "1.0.0-beta.35" - web3-core-method "1.0.0-beta.35" - web3-core-requestmanager "1.0.0-beta.35" - web3-utils "1.0.0-beta.35" - web3-core@1.0.0-beta.37: version "1.0.0-beta.37" resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.0.0-beta.37.tgz#66c2c7000772c9db36d737ada31607ace09b7e90" @@ -33024,16 +29597,6 @@ web3-core@1.2.1: web3-core-requestmanager "1.2.1" web3-utils "1.2.1" -web3-eth-abi@1.0.0-beta.35: - version "1.0.0-beta.35" - resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.0.0-beta.35.tgz#2eb9c1c7c7233db04010defcb192293e0db250e6" - integrity sha512-KUDC+EtFFYG8z01ZleKrASdjj327/rtWHzEt6RWsEj7bBa0bGp9nEh+nqdZx/Sdgz1O8tnfFzJlrRcXpfr1vGg== - dependencies: - bn.js "4.11.6" - underscore "1.8.3" - web3-core-helpers "1.0.0-beta.35" - web3-utils "1.0.0-beta.35" - web3-eth-abi@1.0.0-beta.37: version "1.0.0-beta.37" resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.0.0-beta.37.tgz#55592fa9cd2427d9f0441d78f3b8d0c1359a2a24" @@ -33052,22 +29615,6 @@ web3-eth-abi@1.2.1, web3-eth-abi@^1.0.0-beta.24: underscore "1.9.1" web3-utils "1.2.1" -web3-eth-accounts@1.0.0-beta.35: - version "1.0.0-beta.35" - resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.0.0-beta.35.tgz#7d0e5a69f510dc93874471599eb7abfa9ddf3e63" - integrity sha512-duIgRsfht/0kAW/eQ0X9lKtVIykbETrnM2H7EnvplCzPHtQLodpib4o9JXfh9n6ZDgdDC7cuJoiVB9QJg089ew== - dependencies: - any-promise "1.3.0" - crypto-browserify "3.12.0" - eth-lib "0.2.7" - scrypt.js "0.2.0" - underscore "1.8.3" - uuid "2.0.1" - web3-core "1.0.0-beta.35" - web3-core-helpers "1.0.0-beta.35" - web3-core-method "1.0.0-beta.35" - web3-utils "1.0.0-beta.35" - web3-eth-accounts@1.0.0-beta.37: version "1.0.0-beta.37" resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.0.0-beta.37.tgz#0a5a9f14a6c3bd285e001c15eb3bb38ffa4b5204" @@ -33114,20 +29661,6 @@ web3-eth-admin@1.0.0-beta.55: web3-providers "1.0.0-beta.55" web3-utils "1.0.0-beta.55" -web3-eth-contract@1.0.0-beta.35: - version "1.0.0-beta.35" - resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.0.0-beta.35.tgz#5276242d8a3358d9f1ce92b71575c74f9015935c" - integrity sha512-foPohOg5O1UCGKGZOIs+kQK5IZdV2QQ7pAWwNxH8WHplUA+fre1MurXNpoxknUmH6mYplFhXjqgYq2MsrBpHrA== - dependencies: - underscore "1.8.3" - web3-core "1.0.0-beta.35" - web3-core-helpers "1.0.0-beta.35" - web3-core-method "1.0.0-beta.35" - web3-core-promievent "1.0.0-beta.35" - web3-core-subscriptions "1.0.0-beta.35" - web3-eth-abi "1.0.0-beta.35" - web3-utils "1.0.0-beta.35" - web3-eth-contract@1.0.0-beta.37: version "1.0.0-beta.37" resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.0.0-beta.37.tgz#87f93c95ed16f320ba54943b7886890de6766013" @@ -33184,14 +29717,6 @@ web3-eth-ens@1.2.1: web3-eth-contract "1.2.1" web3-utils "1.2.1" -web3-eth-iban@1.0.0-beta.35: - version "1.0.0-beta.35" - resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.0.0-beta.35.tgz#5aa10327a9abb26bcfc4ba79d7bad18a002b332c" - integrity sha512-H5wkcNcAIc+h/WoDIKv7ZYmrM2Xqu3O7jBQl1IWo73EDVQji+AoB2i3J8tuwI1yZRInRwrfpI3Zuwuf54hXHmQ== - dependencies: - bn.js "4.11.6" - web3-utils "1.0.0-beta.35" - web3-eth-iban@1.0.0-beta.37: version "1.0.0-beta.37" resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.0.0-beta.37.tgz#313a3f18ae2ab00ba98678ea1156b09ef32a3655" @@ -33217,17 +29742,6 @@ web3-eth-iban@1.2.1: bn.js "4.11.8" web3-utils "1.2.1" -web3-eth-personal@1.0.0-beta.35: - version "1.0.0-beta.35" - resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.0.0-beta.35.tgz#ecac95b7a53d04a567447062d5cae5f49879e89f" - integrity sha512-AcM9nnlxu7ZRRxPvkrFB9eLxMM4A2cPfj2aCg21Wb2EpMnhR+b/O1cT33k7ApRowoMpM+T9M8vx2oPNwXfaCOQ== - dependencies: - web3-core "1.0.0-beta.35" - web3-core-helpers "1.0.0-beta.35" - web3-core-method "1.0.0-beta.35" - web3-net "1.0.0-beta.35" - web3-utils "1.0.0-beta.35" - web3-eth-personal@1.0.0-beta.37: version "1.0.0-beta.37" resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.0.0-beta.37.tgz#187472f51861e2b6d45da43411801bc91a859f9a" @@ -33250,24 +29764,6 @@ web3-eth-personal@1.2.1: web3-net "1.2.1" web3-utils "1.2.1" -web3-eth@1.0.0-beta.35: - version "1.0.0-beta.35" - resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.0.0-beta.35.tgz#c52c804afb95e6624b6f5e72a9af90fbf5005b68" - integrity sha512-04mcb2nGPXThawuuYICPOxv0xOHofvQKsjZeIq+89nyOC8DQMGTAErDkGyMHQYtjpth5XDhic0wuEsA80AmFZA== - dependencies: - underscore "1.8.3" - web3-core "1.0.0-beta.35" - web3-core-helpers "1.0.0-beta.35" - web3-core-method "1.0.0-beta.35" - web3-core-subscriptions "1.0.0-beta.35" - web3-eth-abi "1.0.0-beta.35" - web3-eth-accounts "1.0.0-beta.35" - web3-eth-contract "1.0.0-beta.35" - web3-eth-iban "1.0.0-beta.35" - web3-eth-personal "1.0.0-beta.35" - web3-net "1.0.0-beta.35" - web3-utils "1.0.0-beta.35" - web3-eth@1.0.0-beta.37: version "1.0.0-beta.37" resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.0.0-beta.37.tgz#0e8ffcd857a5f85ae4b5f052ad831ca5c56f4f74" @@ -33306,15 +29802,6 @@ web3-eth@1.2.1: web3-net "1.2.1" web3-utils "1.2.1" -web3-net@1.0.0-beta.35: - version "1.0.0-beta.35" - resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.0.0-beta.35.tgz#5c6688e0dea71fcd910ee9dc5437b94b7f6b3354" - integrity sha512-bbwaQ/KohGjIJ6HAKbZ6KrklCAaG6/B7hIbAbVLSFLxF+Yz9lmAgQYaDInpidpC/NLb3WOmcbRF+P77J4qMVIA== - dependencies: - web3-core "1.0.0-beta.35" - web3-core-method "1.0.0-beta.35" - web3-utils "1.0.0-beta.35" - web3-net@1.0.0-beta.37: version "1.0.0-beta.37" resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.0.0-beta.37.tgz#b494136043f3c6ba84fe4a47d4c028c2a63c9a8e" @@ -33373,32 +29860,6 @@ web3-provider-engine@14.0.6: xhr "^2.2.0" xtend "^4.0.1" -web3-provider-engine@14.1.0: - version "14.1.0" - resolved "https://registry.yarnpkg.com/web3-provider-engine/-/web3-provider-engine-14.1.0.tgz#91590020f8b8c1b65846321310cbfdb039090fc6" - integrity sha512-vGZtqhSUzGTiMGhJXNnB/aRDlrPZLhLnBZ2NPArkZtr8XSrwg9m08tw4+PuWg5za0TJuoE/vuPQc501HddZZWw== - dependencies: - async "^2.5.0" - backoff "^2.5.0" - clone "^2.0.0" - cross-fetch "^2.1.0" - eth-block-tracker "^3.0.0" - eth-json-rpc-infura "^3.1.0" - eth-sig-util "^1.4.2" - ethereumjs-block "^1.2.2" - ethereumjs-tx "^1.2.0" - ethereumjs-util "^5.1.5" - ethereumjs-vm "^2.3.4" - json-rpc-error "^2.0.0" - json-stable-stringify "^1.0.1" - promise-to-callback "^1.0.0" - readable-stream "^2.2.9" - request "^2.85.0" - semaphore "^1.0.3" - ws "^5.1.1" - xhr "^2.2.0" - xtend "^4.0.1" - web3-provider-engine@14.2.0: version "14.2.0" resolved "https://registry.yarnpkg.com/web3-provider-engine/-/web3-provider-engine-14.2.0.tgz#2efec157b2c429c5c674c079aea96b0a06de8b3d" @@ -33473,14 +29934,6 @@ web3-provider-engine@^8.4.0: xhr "^2.2.0" xtend "^4.0.1" -web3-providers-http@1.0.0-beta.35: - version "1.0.0-beta.35" - resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.0.0-beta.35.tgz#92059d9d6de6e9f82f4fae30b743efd841afc1e1" - integrity sha512-DcIMFq52Fb08UpWyZ3ZlES6NsNqJnco4hBS/Ej6eOcASfuUayPI+GLkYVZsnF3cBYqlH+DOKuArcKSuIxK7jIA== - dependencies: - web3-core-helpers "1.0.0-beta.35" - xhr2-cookies "1.1.0" - web3-providers-http@1.0.0-beta.37: version "1.0.0-beta.37" resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.0.0-beta.37.tgz#c06efd60e16e329e25bd268d2eefc68d82d13651" @@ -33497,15 +29950,6 @@ web3-providers-http@1.2.1: web3-core-helpers "1.2.1" xhr2-cookies "1.1.0" -web3-providers-ipc@1.0.0-beta.35: - version "1.0.0-beta.35" - resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.0.0-beta.35.tgz#031afeb10fade2ebb0ef2fb82f5e58c04be842d9" - integrity sha512-iB0FG0HcpUnayfa8pn4guqEQ4Y1nrroi/jffdtQgFkrNt0sD3fMSwwC0AbmECqj3tDLl0e1slBR0RENll+ZF0g== - dependencies: - oboe "2.1.3" - underscore "1.8.3" - web3-core-helpers "1.0.0-beta.35" - web3-providers-ipc@1.0.0-beta.37: version "1.0.0-beta.37" resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.0.0-beta.37.tgz#55d247e7197257ca0c3e4f4b0fe1561311b9d5b9" @@ -33524,15 +29968,6 @@ web3-providers-ipc@1.2.1: underscore "1.9.1" web3-core-helpers "1.2.1" -web3-providers-ws@1.0.0-beta.35: - version "1.0.0-beta.35" - resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.0.0-beta.35.tgz#5d38603fd450243a26aae0ff7f680644e77fa240" - integrity sha512-Cx64NgDStynKaUGDIIOfaCd0fZusL8h5avKTkdTjUu2aHhFJhZoVBGVLhoDtUaqZGWIZGcBJOoVf2JkGUOjDRQ== - dependencies: - underscore "1.8.3" - web3-core-helpers "1.0.0-beta.35" - websocket "git://github.com/frozeman/WebSocket-Node.git#browserifyCompatible" - web3-providers-ws@1.0.0-beta.37: version "1.0.0-beta.37" resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.0.0-beta.37.tgz#77c15aebc00b75d760d22d063ac2e415bdbef72f" @@ -33568,16 +30003,6 @@ web3-providers@1.0.0-beta.55: websocket "^1.0.28" xhr2-cookies "1.1.0" -web3-shh@1.0.0-beta.35: - version "1.0.0-beta.35" - resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.0.0-beta.35.tgz#7e4a585f8beee0c1927390937c6537748a5d1a58" - integrity sha512-8qSonk/x0xabERS9Sr6AIADN/Ty+5KwARkkGIfSYHKqFpdMDz+76F7cUCxtoCZoS8K04xgZlDKYe0TJXLYA0Fw== - dependencies: - web3-core "1.0.0-beta.35" - web3-core-method "1.0.0-beta.35" - web3-core-subscriptions "1.0.0-beta.35" - web3-net "1.0.0-beta.35" - web3-shh@1.0.0-beta.37: version "1.0.0-beta.37" resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.0.0-beta.37.tgz#3246ce5229601b525020828a56ee283307057105" @@ -33598,19 +30023,6 @@ web3-shh@1.2.1: web3-core-subscriptions "1.2.1" web3-net "1.2.1" -web3-utils@1.0.0-beta.35: - version "1.0.0-beta.35" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.0.0-beta.35.tgz#ced9e1df47c65581c441c5f2af76b05a37a273d7" - integrity sha512-Dq6f0SOKj3BDFRgOPnE6ALbzBDCKVIW8mKWVf7tGVhTDHf+wQaWwQSC3aArFSqdExB75BPBPyDpuMTNszhljpA== - dependencies: - bn.js "4.11.6" - eth-lib "0.1.27" - ethjs-unit "0.1.6" - number-to-bn "1.7.0" - randomhex "0.1.5" - underscore "1.8.3" - utf8 "2.1.1" - web3-utils@1.0.0-beta.37: version "1.0.0-beta.37" resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.0.0-beta.37.tgz#ab868a90fe5e649337e38bdaf72133fcbf4d414d" @@ -33624,7 +30036,7 @@ web3-utils@1.0.0-beta.37: underscore "1.8.3" utf8 "2.1.1" -web3-utils@1.0.0-beta.55, web3-utils@^1.0.0-beta.37: +web3-utils@1.0.0-beta.55: version "1.0.0-beta.55" resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.0.0-beta.55.tgz#beb40926b7c04208b752d36a9bc959d27a04b308" integrity sha512-ASWqUi8gtWK02Tp8ZtcoAbHenMpQXNvHrakgzvqTNNZn26wgpv+Q4mdPi0KOR6ZgHFL8R/9b5BBoUTglS1WPpg== @@ -33640,7 +30052,7 @@ web3-utils@1.0.0-beta.55, web3-utils@^1.0.0-beta.37: randombytes "^2.1.0" utf8 "2.1.1" -web3-utils@1.2.1: +web3-utils@1.2.1, web3-utils@^1.0.0-beta.37: version "1.2.1" resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.2.1.tgz#21466e38291551de0ab34558de21512ac4274534" integrity sha512-Mrcn3l58L+yCKz3zBryM6JZpNruWuT0OCbag8w+reeNROSGVlXzUQkU+gtAwc9JCZ7tKUyg67+2YUGqUjVcyBA== @@ -33675,19 +30087,6 @@ web3@0.20.6: xhr2 "*" xmlhttprequest "*" -web3@1.0.0-beta.35: - version "1.0.0-beta.35" - resolved "https://registry.yarnpkg.com/web3/-/web3-1.0.0-beta.35.tgz#6475095bd451a96e50a32b997ddee82279292f11" - integrity sha512-xwDmUhvTcHQvvNnOPcPZZgCxKUsI2e+GbHy7JkTK3/Rmnutazy8x7fsAXT9myw7V1qpi3GgLoZ3fkglSUbg1Mg== - dependencies: - web3-bzz "1.0.0-beta.35" - web3-core "1.0.0-beta.35" - web3-eth "1.0.0-beta.35" - web3-eth-personal "1.0.0-beta.35" - web3-net "1.0.0-beta.35" - web3-shh "1.0.0-beta.35" - web3-utils "1.0.0-beta.35" - web3@1.0.0-beta.37: version "1.0.0-beta.37" resolved "https://registry.yarnpkg.com/web3/-/web3-1.0.0-beta.37.tgz#b42c30e67195f816cd19d048fda872f70eca7083" @@ -33792,7 +30191,7 @@ webpack-merge@^4.1.0: dependencies: lodash "^4.17.5" -webpack-sources@1.3.0, webpack-sources@^1.3.0: +webpack-sources@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.3.0.tgz#2a28dcb9f1f45fe960d8f1493252b5ee6530fa85" integrity sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA== @@ -33800,15 +30199,7 @@ webpack-sources@1.3.0, webpack-sources@^1.3.0: source-list-map "^2.0.0" source-map "~0.6.1" -webpack-sources@^1.0.1, webpack-sources@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.1.0.tgz#a101ebae59d6507354d71d8013950a3a8b7a5a54" - integrity sha512-aqYp18kPphgoO5c/+NaUvEeACtZjMESmDChuD3NBciVpah3XpMEU9VAAtIaB1BsfJWWTSdv8Vv1m3T0aRk2dUw== - dependencies: - source-list-map "^2.0.0" - source-map "~0.6.1" - -webpack-sources@^1.4.0, webpack-sources@^1.4.1: +webpack-sources@^1.0.1, webpack-sources@^1.1.0, webpack-sources@^1.3.0, webpack-sources@^1.4.0, webpack-sources@^1.4.1: version "1.4.3" resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== @@ -33945,17 +30336,7 @@ websocket-extensions@>=0.1.1: resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29" integrity sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg== -websocket@1.0.26: - version "1.0.26" - resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.26.tgz#a03a01299849c35268c83044aa919c6374be8194" - integrity sha512-fjcrYDPIQxpTnqFQ9JjxUQcdvR89MFAOjPBlF+vjOt49w/XW4fJknUoMz/mDIn2eK1AdslVojcaOxOqyZZV8rw== - dependencies: - debug "^2.2.0" - nan "^2.3.3" - typedarray-to-buffer "^3.1.2" - yaeti "^0.0.6" - -websocket@1.0.29: +websocket@1.0.29, websocket@^1.0.28: version "1.0.29" resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.29.tgz#3f83e49d3279657c58b02a22d90749c806101b98" integrity sha512-WhU8jKXC8sTh6ocLSqpZRlOKMNYGwUvjA5+XcIgIk/G3JCaDfkZUr0zA19sVSxJ0TEvm0i5IBzr54RZC4vzW7g== @@ -33966,16 +30347,6 @@ websocket@1.0.29: typedarray-to-buffer "^3.1.5" yaeti "^0.0.6" -websocket@^1.0.28: - version "1.0.28" - resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.28.tgz#9e5f6fdc8a3fe01d4422647ef93abdd8d45a78d3" - integrity sha512-00y/20/80P7H4bCYkzuuvvfDvh+dgtXi5kzDf3UcZwN6boTYaKvsrtZ5lIYm1Gsg48siMErd9M4zjSYfYFHTrA== - dependencies: - debug "^2.2.0" - nan "^2.11.0" - typedarray-to-buffer "^3.1.5" - yaeti "^0.0.6" - "websocket@git://github.com/frozeman/WebSocket-Node.git#browserifyCompatible": version "1.0.26" resolved "git://github.com/frozeman/WebSocket-Node.git#6c72925e3f8aaaea8dc8450f97627e85263999f2" @@ -33991,7 +30362,6 @@ websocket@^1.0.28: dependencies: debug "^2.2.0" es5-ext "^0.10.50" - gulp "^4.0.2" nan "^2.14.0" typedarray-to-buffer "^3.1.5" yaeti "^0.0.6" @@ -34056,14 +30426,7 @@ which-pm-runs@^1.0.0: resolved "https://registry.yarnpkg.com/which-pm-runs/-/which-pm-runs-1.0.0.tgz#670b3afbc552e0b55df6b7780ca74615f23ad1cb" integrity sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs= -which@1, which@^1.2.12, which@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" - integrity sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg== - dependencies: - isexe "^2.0.0" - -which@1.3.1, which@^1.1.1, which@^1.2.14, which@^1.2.9, which@^1.3.1: +which@1, which@1.3.1, which@^1.1.1, which@^1.2.12, which@^1.2.14, which@^1.2.9, which@^1.3.0, which@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== @@ -34077,20 +30440,13 @@ which@~1.2.11, which@~1.2.14: dependencies: isexe "^2.0.0" -wide-align@1.1.3: +wide-align@1.1.3, wide-align@^1.1.0: version "1.1.3" resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== dependencies: string-width "^1.0.2 || 2" -wide-align@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710" - integrity sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w== - dependencies: - string-width "^1.0.2" - widest-line@^2.0.0, widest-line@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.1.tgz#7438764730ec7ef4381ce4df82fb98a53142a3fc" @@ -34203,14 +30559,7 @@ worker-farm@1.5.2: errno "^0.1.4" xtend "^4.0.1" -worker-farm@^1.5.2: - version "1.6.0" - resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.6.0.tgz#aecc405976fab5a95526180846f0dba288f3a4a0" - integrity sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ== - dependencies: - errno "~0.1.7" - -worker-farm@^1.7.0: +worker-farm@^1.5.2, worker-farm@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw== @@ -34282,16 +30631,7 @@ write-file-atomic@^1.1.2, write-file-atomic@^1.1.4, write-file-atomic@^1.2.0: imurmurhash "^0.1.4" slide "^1.1.5" -write-file-atomic@^2.0.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" - integrity sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA== - dependencies: - graceful-fs "^4.1.11" - imurmurhash "^0.1.4" - signal-exit "^3.0.2" - -write-file-atomic@^2.4.2: +write-file-atomic@^2.0.0, write-file-atomic@^2.3.0, write-file-atomic@^2.4.2: version "2.4.3" resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.3.tgz#1fd2e9ae1df3e75b8d8c367443c692d4ca81f481" integrity sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ== @@ -34486,17 +30826,7 @@ xhr@2.3.3: parse-headers "^2.0.0" xtend "^4.0.0" -xhr@^2.0.4, xhr@^2.3.3: - version "2.4.1" - resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.4.1.tgz#ba982cced205ae5eec387169ac9dc77ca4853d38" - integrity sha512-pAIU5vBr9Hiy5cpFIbPnwf0C18ZF86DBsZKrlsf87N5De/JbA6RJ83UP/cv+aljl4S40iRVMqP4pr4sF9Dnj0A== - dependencies: - global "~4.3.0" - is-function "^1.0.1" - parse-headers "^2.0.0" - xtend "^4.0.0" - -xhr@^2.2.0: +xhr@^2.0.4, xhr@^2.2.0, xhr@^2.3.3: version "2.5.0" resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.5.0.tgz#bed8d1676d5ca36108667692b74b316c496e49dd" integrity sha512-4nlO/14t3BNUZRXIXfXe+3N6w3s1KoxcJUUURctd64BLRe67E4gRwp4PjywtDY72fXpZ1y6Ch0VZQRY/gMPzzQ== @@ -34561,21 +30891,11 @@ xregexp@2.0.0: resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-2.0.0.tgz#52a63e56ca0b84a7f3a5f3d61872f126ad7a5943" integrity sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM= -xregexp@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.0.0.tgz#e698189de49dd2a18cc5687b05e17c8e43943020" - integrity sha512-PHyM+sQouu7xspQQwELlGwwd05mXUFqwFYfqPO0cC7x4fxyHnnuetmQr6CjJiafIDoH4MogHb9dOoJzR/Y4rFg== - -"xtend@>=4.0.0 <4.1.0-0": +"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.0, xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== -xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.0, xtend@~4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" - integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68= - xtend@~2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-2.1.2.tgz#6efecc2a4dad8e6962c4901b337ce7ba87b5d28b" @@ -34608,17 +30928,12 @@ yallist@^2.0.0, yallist@^2.1.2: resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= -yallist@^3.0.0, yallist@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9" - integrity sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k= - -yallist@^3.0.3: +yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A== -yargs-parser@10.1.0, yargs-parser@10.x, yargs-parser@^10.1.0: +yargs-parser@10.1.0, yargs-parser@10.x: 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== @@ -34693,7 +31008,7 @@ yargs-unparser@1.6.0: lodash "^4.17.15" yargs "^13.3.0" -yargs@11.1.0: +yargs@11.1.0, yargs@^11.0.0: version "11.1.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-11.1.0.tgz#90b869934ed6e871115ea2ff58b03f4724ed2d77" integrity sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A== @@ -34711,7 +31026,7 @@ yargs@11.1.0: y18n "^3.2.1" yargs-parser "^9.0.2" -yargs@13.2.4, yargs@^13.0.0: +yargs@13.2.4: version "13.2.4" resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.2.4.tgz#0b562b794016eb9651b98bd37acf364aa5d6dc83" integrity sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg== @@ -34728,7 +31043,7 @@ yargs@13.2.4, yargs@^13.0.0: y18n "^4.0.0" yargs-parser "^13.1.0" -yargs@13.3.0, yargs@^13.1.0, yargs@^13.2.0, yargs@^13.3.0: +yargs@13.3.0, yargs@^13.0.0, yargs@^13.1.0, yargs@^13.2.0, yargs@^13.3.0: version "13.3.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.0.tgz#4c657a55e07e5f2cf947f8a366567c04a0dedc83" integrity sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA== @@ -34779,43 +31094,7 @@ yargs@^10.0.3: y18n "^3.2.1" yargs-parser "^8.1.0" -yargs@^11.0.0: - version "11.0.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-11.0.0.tgz#c052931006c5eee74610e5fc0354bedfd08a201b" - integrity sha512-Rjp+lMYQOWtgqojx1dEWorjCofi1YN7AoFvYV7b1gx/7dAAeuI4kN5SZiEvr0ZmsZTOpDRcCqrpI10L31tFkBw== - dependencies: - cliui "^4.0.0" - decamelize "^1.1.1" - find-up "^2.1.0" - get-caller-file "^1.0.1" - os-locale "^2.0.0" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^2.0.0" - which-module "^2.0.0" - y18n "^3.2.1" - yargs-parser "^9.0.2" - -yargs@^12.0.1: - version "12.0.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.2.tgz#fe58234369392af33ecbef53819171eff0f5aadc" - integrity sha512-e7SkEx6N6SIZ5c5H22RTZae61qtn3PYUE8JYbBFlK9sYmh3DMQ6E5ygtaG/2BW0JZi4WGgTR2IV5ChqlqrDGVQ== - dependencies: - cliui "^4.0.0" - decamelize "^2.0.0" - find-up "^3.0.0" - get-caller-file "^1.0.1" - os-locale "^3.0.0" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^2.0.0" - which-module "^2.0.0" - y18n "^3.2.1 || ^4.0.0" - yargs-parser "^10.1.0" - -yargs@^12.0.2, yargs@^12.0.5: +yargs@^12.0.1, yargs@^12.0.2, yargs@^12.0.5: version "12.0.5" resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw== From 2208d385c80149fbc19c1e78f9a6a951def4cc43 Mon Sep 17 00:00:00 2001 From: J M Rossy Date: Tue, 19 Nov 2019 14:45:44 +0100 Subject: [PATCH 20/61] [Wallet] Implement new redeem invite design and add skip option (#1757) * Implement new design for enter invite screen: * Generalize the CodeRow component to be shared btwn verification screen and invite screen * Add option to skip invite redemption * Fix small bug in KeyboardSpacer toggle callback * Clean up strings in NuxNamePin.json a bit --- packages/mobile/locales/en-US/global.json | 5 +- .../mobile/locales/en-US/nuxNamePin1.json | 41 +- .../locales/en-US/nuxVerification2.json | 1 - packages/mobile/locales/es-419/global.json | 5 +- .../mobile/locales/es-419/nuxNamePin1.json | 44 +- .../locales/es-419/nuxVerification2.json | 1 - .../mobile/src/components/CodeRow.test.tsx | 27 + packages/mobile/src/components/CodeRow.tsx | 155 ++++ .../__snapshots__/CodeRow.test.tsx.snap | 232 +++++ .../src/invite/EnterInviteCode.test.tsx | 52 +- .../mobile/src/invite/EnterInviteCode.tsx | 263 +++--- .../EnterInviteCode.test.tsx.snap | 815 +++--------------- packages/mobile/src/invite/actions.ts | 32 +- packages/mobile/src/invite/reducer.test.ts | 25 - packages/mobile/src/invite/reducer.ts | 20 + packages/mobile/src/invite/saga.ts | 24 +- .../src/verify/VerificationCodeRow.test.tsx | 58 +- .../mobile/src/verify/VerificationCodeRow.tsx | 153 +--- .../src/verify/VerificationInputScreen.tsx | 29 +- .../VerificationCodeRow.test.tsx.snap | 167 +--- .../VerificationInputScreen.test.tsx.snap | 80 +- packages/mobile/test/schemas.ts | 4 + .../components/KeyboardSpacer.tsx | 4 +- .../components/WithTextInputPasteAware.tsx | 10 +- 24 files changed, 858 insertions(+), 1389 deletions(-) create mode 100644 packages/mobile/src/components/CodeRow.test.tsx create mode 100644 packages/mobile/src/components/CodeRow.tsx create mode 100644 packages/mobile/src/components/__snapshots__/CodeRow.test.tsx.snap delete mode 100644 packages/mobile/src/invite/reducer.test.ts diff --git a/packages/mobile/locales/en-US/global.json b/packages/mobile/locales/en-US/global.json index 204ccb7b440..d20428da701 100644 --- a/packages/mobile/locales/en-US/global.json +++ b/packages/mobile/locales/en-US/global.json @@ -94,5 +94,8 @@ "calculateFeeFailed": "Could not calculate fee", "failedToSwitchSyncModes": "Failed to switch sync modes", "gold": "Gold", - "localCurrencyTitle": "Select Currency" + "localCurrencyTitle": "Select Currency", + "or": "or", + "accepted": "Accepted", + "processing": "Processing" } diff --git a/packages/mobile/locales/en-US/nuxNamePin1.json b/packages/mobile/locales/en-US/nuxNamePin1.json index d6e699559d4..e5307c16a84 100644 --- a/packages/mobile/locales/en-US/nuxNamePin1.json +++ b/packages/mobile/locales/en-US/nuxNamePin1.json @@ -1,13 +1,6 @@ { - "selectCountry": "Select Country", "chooseLanguage": "Choose Language", "continue": "Continue", - "secureAsset": - "Celo keeps your assets secure and enables you to send and receive value with anyone", - "stableAsset": - "{{CeloDollars}} are a stable digital asset that tracks to the value of the US {{Dollar}}", - "verifyNumber": "Verify your phone number so other Celo users can find you and send you value", - "syncNetwork": "Syncing with Network", "welcomeCelo": "Welcome to Celo Wallet", "chooseCountryCode": "Country Code", "chooseCountry": "Country", @@ -20,33 +13,17 @@ "phoneNumber": "000 000 0000", "inviteCodeText": { "title": "Enter Invite Code", - "copyInvite": { - "0": "Copy invite ", - "1": "from Messages App and come back" - }, - "openMessages": { - "message": "Open Messages", - "hint": { - "0": "Hint ", - "1": "Copy the whole SMS message" - } - }, - "pasteInviteCode": { - "message": "Paste Invite Code!", - "hint": "Looks like you've copied a code" - }, - "validating": "Great! Validating copied invite code", - "inviteAccepted": "🎉 Invite Accepted!", - "askForInvite": { - "0": "Request an invite from a friend on Celo or sign up for the {{testnet}} network at ", - "1": "celo.org/app" - } + "body": + "If you have an invite code, please enter it here. You can copy and paste the entire message.", + "codeHeader": "Invite Code", + "codePlaceholder": "Celo code: am9hBM3tiA+CuNb...", + "noCode": "Don’t have a code? ", + "requestCodeNoFaucet": " Request an invite from a friend with a Celo Wallet or ", + "requestCodeFromFaucet": "Request an invite at ", + "faucetLink": "celo.org/app", + "skip": "continue without." }, - "enterFullName": "Please enter your first and last name", "fullName": "Full Name", - "InvitationCode": "Invitation Code", - "optIn": "Opt In", - "submitting": "Submitting ...", "importIt": "Restore Existing Wallet", "cancel": "Cancel", "important": "Important", diff --git a/packages/mobile/locales/en-US/nuxVerification2.json b/packages/mobile/locales/en-US/nuxVerification2.json index 2ad59cba206..ac63138f251 100644 --- a/packages/mobile/locales/en-US/nuxVerification2.json +++ b/packages/mobile/locales/en-US/nuxVerification2.json @@ -58,7 +58,6 @@ "codeHeader3": "Third Code", "codesMissing": "I didn’t receive three codes", "tip": "Typing? Try copying and pasting the code.", - "codeAccepted": "Accepted", "sendingCodes": "Sending verification codes..." }, "missingCodesModal": { diff --git a/packages/mobile/locales/es-419/global.json b/packages/mobile/locales/es-419/global.json index 438e970a108..b3d4e7b5a29 100755 --- a/packages/mobile/locales/es-419/global.json +++ b/packages/mobile/locales/es-419/global.json @@ -95,5 +95,8 @@ "calculateFeeFailed": "No se pudo calcular la comisión", "failedToSwitchSyncModes": "Error al cambiar de red modos", "gold": "Oro", - "localCurrencyTitle": "Seleccione el tipo de moneda" + "localCurrencyTitle": "Seleccione el tipo de moneda", + "or": "o", + "accepted": "Aceptado", + "processing": "Procesando" } diff --git a/packages/mobile/locales/es-419/nuxNamePin1.json b/packages/mobile/locales/es-419/nuxNamePin1.json index 5e5149443a9..a213c68becf 100755 --- a/packages/mobile/locales/es-419/nuxNamePin1.json +++ b/packages/mobile/locales/es-419/nuxNamePin1.json @@ -1,14 +1,6 @@ { - "selectCountry": "Seleccionar país", "chooseLanguage": "Elegir idioma", "continue": "Continuar", - "secureAsset": - "Celo mantiene tu patrimonio seguro y le permite enviar capital a quien quiera y recibirlos de cualquier persona", - "stableAsset": - "Los {{CeloDollars}} constituyen un activo digital estable que está alineado con el valor del dólar estadounidense", - "verifyNumber": - "Verifique tu número de teléfono para conectarse con otros usuarios y recibir dinero", - "syncNetwork": "Sincronizando con la red", "welcomeCelo": "Te damos la bienvenida a Celo", "chooseCountryCode": "Código de país", "chooseCountry": "País", @@ -20,34 +12,18 @@ }, "phoneNumber": "000 000 0000", "inviteCodeText": { - "title": "Ingresa el código de invitación", - "copyInvite": { - "0": "Copia el código de invitación ", - "1": "desde la aplicación de mensajes y vuelve." - }, - "openMessages": { - "message": "Abrir mensajes", - "hint": { - "0": "Pista: ", - "1": "Copia el mensaje SMS completo" - } - }, - "pasteInviteCode": { - "message": "Pegar código de invitación!", - "hint": "Parece que has copiado un código" - }, - "validating": "Genial! Validando el código de invitación copiado", - "inviteAccepted": "🎉 Invitación aceptada!", - "askForInvite": { - "0": "Solicite una invitación de un amigo en Celo o regístrese en la red {{testnet}} en ", - "1": "celo.org/app" - } + "title": "Ingresa el Código de Invitación", + "body": + "Si tiene un código de invitación, ingréselo aquí. Puede copiar y pegar todo el mensaje.", + "codeHeader": "Código de Invitación", + "codePlaceholder": "Celo código: am9hBM3tiA+CuNb...", + "noCode": "¿No tienen un código? ", + "requestCodeNoFaucet": " Solicite una invitación de un amigo con una billetera Celo o ", + "requestCodeFromFaucet": "Solicite una invitación en ", + "faucetLink": "celo.org/app", + "skip": "continuar sin." }, - "enterFullName": "Ingresa tu nombre y apellido", "fullName": "Nombre completo", - "InvitationCode": "Código de invitación", - "optIn": "Inscribirse", - "submitting": "Enviando ...", "importIt": "Restaurar tu monedero existente", "cancel": "Cancelar", "important": "Importante", diff --git a/packages/mobile/locales/es-419/nuxVerification2.json b/packages/mobile/locales/es-419/nuxVerification2.json index a68e321ebb1..c7ed7ebcf97 100755 --- a/packages/mobile/locales/es-419/nuxVerification2.json +++ b/packages/mobile/locales/es-419/nuxVerification2.json @@ -60,7 +60,6 @@ "codeHeader3": "Tercer código", "codesMissing": "No recibí tres códigos", "tip": "¿Está escribiendo el código? ¿Por qué no lo copia y pega?", - "codeAccepted": "Aceptado", "sendingCodes": "Envío de códigos de verificación..." }, "missingCodesModal": { diff --git a/packages/mobile/src/components/CodeRow.test.tsx b/packages/mobile/src/components/CodeRow.test.tsx new file mode 100644 index 00000000000..c64b748739e --- /dev/null +++ b/packages/mobile/src/components/CodeRow.test.tsx @@ -0,0 +1,27 @@ +import * as React from 'react' +import 'react-native' +import { render } from 'react-native-testing-library' +import CodeRow, { CodeRowStatus } from 'src/components/CodeRow' + +describe('CodeRow', () => { + it('renders correctly for all CodeRowStatus states', () => { + ;[ + CodeRowStatus.DISABLED, + CodeRowStatus.INPUTTING, + CodeRowStatus.PROCESSING, + CodeRowStatus.RECEIVED, + CodeRowStatus.ACCEPTED, + ].map((status) => { + const { toJSON } = render( + + ) + expect(toJSON()).toMatchSnapshot() + }) + }) +}) diff --git a/packages/mobile/src/components/CodeRow.tsx b/packages/mobile/src/components/CodeRow.tsx new file mode 100644 index 00000000000..152c82fe1f0 --- /dev/null +++ b/packages/mobile/src/components/CodeRow.tsx @@ -0,0 +1,155 @@ +import TextInput from '@celo/react-components/components/TextInput' +import withTextInputPasteAware from '@celo/react-components/components/WithTextInputPasteAware' +import Checkmark from '@celo/react-components/icons/Checkmark' +import colors from '@celo/react-components/styles/colors' +import fontStyles from '@celo/react-components/styles/fonts' +import { componentStyles } from '@celo/react-components/styles/styles' +import * as React from 'react' +import { withNamespaces, WithNamespaces } from 'react-i18next' +import { ActivityIndicator, StyleSheet, Text, View } from 'react-native' +import { Namespaces } from 'src/i18n' + +const CodeInput = withTextInputPasteAware(TextInput) + +export enum CodeRowStatus { + DISABLED, // input disabled + INPUTTING, // input enabled + PROCESSING, // is the inputted code being processed + RECEIVED, // is the inputted code recieved but not yet confirmed + ACCEPTED, // has the code been accepted and completed +} + +export interface CodeRowProps { + status: CodeRowStatus + inputValue: string + inputPlaceholder: string + onInputChange: (value: string) => void + shouldShowClipboard: (value: string) => boolean +} + +type Props = CodeRowProps & WithNamespaces + +function CodeRow({ + status, + inputValue, + inputPlaceholder, + onInputChange, + shouldShowClipboard, + t, +}: Props) { + if (status === CodeRowStatus.DISABLED) { + return ( + + {inputPlaceholder} + + ) + } + + if (status === CodeRowStatus.INPUTTING) { + return ( + + ) + } + + const shortenedInput = inputValue && inputValue.substr(0, 25) + '...' + + if (status === CodeRowStatus.PROCESSING) { + return ( + + {shortenedInput || t('processing')} + + + ) + } + + if (status === CodeRowStatus.RECEIVED) { + return ( + + + {shortenedInput || t('processing')} + + + ) + } + + if (status === CodeRowStatus.ACCEPTED) { + return ( + + + {shortenedInput || t('accepted')} + + + + + + ) + } + + return null +} + +const styles = StyleSheet.create({ + codeInput: { + ...componentStyles.roundedBorder, + flex: 0, + backgroundColor: '#FFF', + borderColor: colors.inputBorder, + height: 50, + marginVertical: 5, + }, + codeReceivedContainer: { + justifyContent: 'center', + marginVertical: 5, + paddingHorizontal: 10, + backgroundColor: colors.darkLightest, + borderRadius: 3, + height: 50, + }, + checkmarkContainer: { + backgroundColor: colors.darkLightest, + position: 'absolute', + top: 3, + right: 3, + padding: 10, + }, + codeProcessingContainer: { + ...componentStyles.roundedBorder, + backgroundColor: '#FFF', + position: 'relative', + justifyContent: 'center', + marginVertical: 5, + paddingHorizontal: 10, + borderColor: colors.inputBorder, + height: 50, + }, + codeInputSpinner: { + backgroundColor: '#FFF', + position: 'absolute', + top: 5, + right: 3, + padding: 10, + }, + codeInputDisabledContainer: { + justifyContent: 'center', + paddingHorizontal: 10, + marginVertical: 5, + borderColor: colors.inputBorder, + borderRadius: 3, + borderWidth: 1, + height: 50, + backgroundColor: '#F0F0F0', + }, + codeValue: { + ...fontStyles.body, + fontSize: 15, + color: colors.darkSecondary, + }, +}) + +export default withNamespaces(Namespaces.global)(CodeRow) diff --git a/packages/mobile/src/components/__snapshots__/CodeRow.test.tsx.snap b/packages/mobile/src/components/__snapshots__/CodeRow.test.tsx.snap new file mode 100644 index 00000000000..1ac49b96b1d --- /dev/null +++ b/packages/mobile/src/components/__snapshots__/CodeRow.test.tsx.snap @@ -0,0 +1,232 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`CodeRow renders correctly for all CodeRowStatus states 1`] = ` + + + placeholder + + +`; + +exports[`CodeRow renders correctly for all CodeRowStatus states 2`] = ` + + + + + +`; + +exports[`CodeRow renders correctly for all CodeRowStatus states 3`] = ` + + + test... + + + +`; + +exports[`CodeRow renders correctly for all CodeRowStatus states 4`] = ` + + + test... + + +`; + +exports[`CodeRow renders correctly for all CodeRowStatus states 5`] = ` + + + test... + + + + + + + + +`; diff --git a/packages/mobile/src/invite/EnterInviteCode.test.tsx b/packages/mobile/src/invite/EnterInviteCode.test.tsx index 3dd617b1e88..92d00605a44 100644 --- a/packages/mobile/src/invite/EnterInviteCode.test.tsx +++ b/packages/mobile/src/invite/EnterInviteCode.test.tsx @@ -2,15 +2,9 @@ import * as React from 'react' import { Clipboard } from 'react-native' import RNInstallReferrer from 'react-native-install-referrer' import SendIntentAndroid from 'react-native-send-intent' -import { - fireEvent, - flushMicrotasksQueue, - render, - waitForElement, -} from 'react-native-testing-library' +import { fireEvent, flushMicrotasksQueue, render } from 'react-native-testing-library' import { Provider } from 'react-redux' import * as renderer from 'react-test-renderer' -import { ErrorMessages } from 'src/app/ErrorMessages' import EnterInviteCode, { EnterInviteCode as EnterInviteCodeClass, } from 'src/invite/EnterInviteCode' @@ -66,36 +60,27 @@ describe('EnterInviteCode Screen', () => { expect(tree).toMatchSnapshot() }) - it('renders with an error', () => { - const store = createMockStore({ alert: { underlyingError: ErrorMessages.INVALID_INVITATION } }) - const tree = renderer.create( - - - - ) - expect(tree).toMatchSnapshot() - }) - it('works with partial invite text in clipboard', async () => { - const store = createMockStore() const redeem = jest.fn() clipboardGetStringMock.mockResolvedValue(PARTIAL_INVITE) const wrapper = render( - + ) - const button = await waitForElement(() => wrapper.getByTestId('pasteMessageButton')) - fireEvent.press(button) + const input = wrapper.getByPlaceholder('inviteCodeText.codePlaceholder') + fireEvent.changeText(input, VALID_INVITE) await flushMicrotasksQueue() expect(redeem).toHaveBeenCalledWith(PARTIAL_INVITE_KEY) }) @@ -103,22 +88,22 @@ describe('EnterInviteCode Screen', () => { it('calls redeem invite with valid invite key in clipboard', async () => { const redeem = jest.fn() clipboardGetStringMock.mockResolvedValue(VALID_INVITE) - const wrapper = render( + render( ) - const button = await waitForElement(() => wrapper.getByTestId('pasteMessageButton')) - fireEvent.press(button) await flushMicrotasksQueue() expect(redeem).toHaveBeenCalledWith(VALID_INVITE_KEY) }) @@ -126,68 +111,69 @@ describe('EnterInviteCode Screen', () => { it('does not proceed with an invalid invite key in clipboard', async () => { const redeem = jest.fn() clipboardGetStringMock.mockResolvedValue('abc') - const wrapper = render( + render( ) - fireEvent.press(wrapper.getByTestId('openMessageButton')) await flushMicrotasksQueue() - expect(wrapper.queryByTestId('pasteMessageButton')).toBeNull() expect(redeem).not.toHaveBeenCalled() }) it('calls redeem invite with valid invite key in install referrer data', async () => { const redeem = jest.fn() getReferrerMock.mockResolvedValue(VALID_REFERRER_INVITE) - const wrapper = render( + render( ) - const button = await waitForElement(() => wrapper.getByTestId('pasteMessageButton')) - fireEvent.press(button) + await flushMicrotasksQueue() expect(redeem).toHaveBeenCalledWith(VALID_REFERRER_INVITE_KEY) }) it('does not proceed with an invalid invite key in install referrer data', async () => { const redeem = jest.fn() getReferrerMock.mockResolvedValue(INVALID_REFERRER_INVITE) - const wrapper = render( + render( ) - fireEvent.press(wrapper.getByTestId('openMessageButton')) await flushMicrotasksQueue() - expect(wrapper.queryByTestId('pasteMessageButton')).toBeNull() expect(redeem).not.toHaveBeenCalled() }) }) diff --git a/packages/mobile/src/invite/EnterInviteCode.tsx b/packages/mobile/src/invite/EnterInviteCode.tsx index 3f4240df3a0..ca89f911e31 100644 --- a/packages/mobile/src/invite/EnterInviteCode.tsx +++ b/packages/mobile/src/invite/EnterInviteCode.tsx @@ -1,61 +1,49 @@ import Button, { BtnTypes } from '@celo/react-components/components/Button' -import SmallButton from '@celo/react-components/components/SmallButton' -import SmsCeloSwap from '@celo/react-components/icons/SmsCeloSwap' +import KeyboardAwareScrollView from '@celo/react-components/components/KeyboardAwareScrollView' +import KeyboardSpacer from '@celo/react-components/components/KeyboardSpacer' import colors from '@celo/react-components/styles/colors' import fontStyles from '@celo/react-components/styles/fonts' -import { componentStyles } from '@celo/react-components/styles/styles' -import * as _ from 'lodash' import * as React from 'react' import { WithNamespaces, withNamespaces } from 'react-i18next' -import { - ActivityIndicator, - AppState, - AppStateStatus, - Clipboard, - Platform, - ScrollView, - StyleSheet, - Text, - View, -} from 'react-native' +import { ActivityIndicator, Clipboard, StyleSheet, Text, View } from 'react-native' import SafeAreaView from 'react-native-safe-area-view' -import SendIntentAndroid from 'react-native-send-intent' import { connect } from 'react-redux' import { hideAlert, showError } from 'src/alert/actions' import { componentWithAnalytics } from 'src/analytics/wrapper' -import { ErrorMessages } from 'src/app/ErrorMessages' +import CodeRow, { CodeRowStatus } from 'src/components/CodeRow' import DevSkipButton from 'src/components/DevSkipButton' -import { CELO_FAUCET_LINK, DEFAULT_TESTNET, SHOW_GET_INVITE_LINK } from 'src/config' +import { CELO_FAUCET_LINK, SHOW_GET_INVITE_LINK } from 'src/config' import { Namespaces } from 'src/i18n' -import { redeemInvite } from 'src/invite/actions' +import { redeemInvite, skipInvite } from 'src/invite/actions' import { extractValidInviteCode, getValidInviteCodeFromReferrerData } from 'src/invite/utils' import { nuxNavigationOptionsNoBackButton } from 'src/navigator/Headers' import { navigate } from 'src/navigator/NavigationService' import { Screens } from 'src/navigator/Screens' import { RootState } from 'src/redux/reducers' import { navigateToURI } from 'src/utils/linking' -import Logger from 'src/utils/Logger' import { currentAccountSelector } from 'src/web3/selectors' interface StateProps { redeemComplete: boolean isRedeemingInvite: boolean + isSkippingInvite: boolean account: string | null } interface State { - appState: AppStateStatus - validCode: string | null + inputValue: string } interface DispatchProps { redeemInvite: typeof redeemInvite + skipInvite: typeof skipInvite showError: typeof showError hideAlert: typeof hideAlert } const mapDispatchToProps = { redeemInvite, + skipInvite, showError, hideAlert, } @@ -64,6 +52,7 @@ const mapStateToProps = (state: RootState): StateProps => { return { redeemComplete: state.invite.redeemComplete, isRedeemingInvite: state.invite.isRedeemingInvite, + isSkippingInvite: state.invite.isSkippingInvite, account: currentAccountSelector(state), } } @@ -74,64 +63,28 @@ export class EnterInviteCode extends React.Component { static navigationOptions = nuxNavigationOptionsNoBackButton state: State = { - appState: AppState.currentState, - validCode: null, + inputValue: '', } async componentDidMount() { - AppState.addEventListener('change', this.handleAppStateChange) await this.checkIfValidCodeInClipboard() await this.checkForReferrerCode() } - componentWillUnmount() { - AppState.removeEventListener('change', this.handleAppStateChange) - } - checkForReferrerCode = async () => { const validCode = await getValidInviteCodeFromReferrerData() if (validCode) { - this.setState({ validCode }) + this.setState({ inputValue: validCode }) + this.props.redeemInvite(validCode) } } checkIfValidCodeInClipboard = async () => { const message = await Clipboard.getString() - const validCode = extractValidInviteCode(message) - if (validCode) { - this.setState({ validCode }) - } - } - - handleAppStateChange = async (nextAppState: AppStateStatus) => { - if (this.state.appState.match(/inactive|background/) && nextAppState === 'active') { - await this.checkIfValidCodeInClipboard() + if (extractValidInviteCode(message)) { + this.onInputChange(message) } - this.setState({ appState: nextAppState }) } - - onPressOpenMessage = () => { - if (Platform.OS === 'android') { - SendIntentAndroid.openSMSApp() - } else { - navigateToURI('sms:') - } - } - - onPressPaste = async () => { - this.props.hideAlert() - const { validCode } = this.state - - Logger.debug('Extracted invite code:', validCode || '') - - if (!validCode) { - this.props.showError(ErrorMessages.INVALID_INVITATION) - return - } - - this.props.redeemInvite(validCode) - } - onPressImportClick = async () => { navigate(Screens.ImportWallet) } @@ -144,90 +97,90 @@ export class EnterInviteCode extends React.Component { navigateToURI(CELO_FAUCET_LINK) } + onPressSkip = () => { + this.props.skipInvite() + } + + onInputChange = (value: string) => { + const inviteCode = extractValidInviteCode(value) + if (inviteCode) { + this.setState({ inputValue: inviteCode }) + this.props.redeemInvite(inviteCode) + } else { + this.setState({ inputValue: value }) + } + } + + shouldShowClipboard = (value: string) => { + return !!extractValidInviteCode(value) + } + render() { - const { t, isRedeemingInvite, redeemComplete, account } = this.props - const { validCode } = this.state + const { t, isRedeemingInvite, isSkippingInvite, redeemComplete, account } = this.props + const { inputValue } = this.state + + let codeStatus = CodeRowStatus.INPUTTING + if (isRedeemingInvite) { + codeStatus = CodeRowStatus.PROCESSING + } else if (redeemComplete) { + codeStatus = CodeRowStatus.ACCEPTED + } return ( - - - - - {t('inviteCodeText.title')} - - - {!redeemComplete && ( - - {t('inviteCodeText.copyInvite.0')} - {t('inviteCodeText.copyInvite.1')} - - )} - - {redeemComplete ? ( - - {t('inviteCodeText.inviteAccepted')} - + + + + + {t('inviteCodeText.title')} + + {t('inviteCodeText.body')} + {t('inviteCodeText.codeHeader')} + + + {isSkippingInvite && ( + + + + )} + + {t('inviteCodeText.noCode')} + {SHOW_GET_INVITE_LINK ? ( + <> + {t('inviteCodeText.requestCodeFromFaucet')} + + {t('inviteCodeText.faucetLink')} + + {' ' + t('global:or') + ' '} + + {t('inviteCodeText.skip')} + + ) : ( - !isRedeemingInvite && - (!validCode ? ( - - - - {t('inviteCodeText.openMessages.hint.0')} - - {t('inviteCodeText.openMessages.hint.1')} - - - - ) : ( - - {t('inviteCodeText.pasteInviteCode.hint')} - - - )) + <> + {t('inviteCodeText.requestCodeNoFaucet')} + + {t('inviteCodeText.skip')} + + )} - {isRedeemingInvite && - !redeemComplete && ( - - {t('inviteCodeText.validating')} - - - )} - - - + + - {SHOW_GET_INVITE_LINK && ( - - {t('inviteCodeText.askForInvite.0', { testnet: _.startCase(DEFAULT_TESTNET) })} - - {t('inviteCodeText.askForInvite.1')} - - - )}